0

ポインターを使用してベクターを作成し、Modul から派生したクラス DigOut から新しいオブジェクトを 1 つのメソッドで作成します。

BOOL Cbeckhoff_frontendDlg::OnInitDialog()
{
//...
std::vector<Modul*> arrDigOut;
arrDigOut.push_back(new DigOut(IDC_CHECK1, this,"GVL.DigOut1",pAddr));
//...
for(iNumDO = 0;iNumDO<1;iNumDO++) arrDigOut[iNumDO]->InitCheck(this);
//...
}

次のような別の方法からベクトルにアクセスするにはどうすればよいですか。

void Cbeckhoff_frontendDlg::OnBnClickedButton3()
{
for(iNumDO = 0;iNumDO<1;iNumDO++) arrDigOut[iNumDO]->SetID();
}

パブリック ポインターまたはセッターとゲッターを使用することを考えまし
たが、次のようなメンバー変数を作成できません。

std::vector<Modul*> *   parrDigOut;

Modul が宣言されていないことが不平を言っているところです。

4

3 に答える 3

0

私が正しく理解していれば、それを公開して、その前に次の行を追加してください。

class Modul;
于 2012-07-18T15:13:19.867 に答える
0

あなたの例は、vector関数スコープで宣言している印象を与えます。その有効期間は、関数呼び出しの最後で終了します (そして、すべてのメモリがリークされます)。それをクラス メンバーおよびメンバー関数として格納し、それを および のメンバー関数に転送beginendます。それらがポインターであるという事実を隠すために、おそらくそれらを でラップします。beginendvectordereference_iterator

class foo {
public:
  foo() { 
    // add things to s_
  }

  ~foo() { 
    // dont forget to delete everything in s_
  }
  typedef std::vector<my_stuff*>::iterator iterator;
  typedef std::vector<my_stuff*>::const_iterator const_iterator;
  iterator begin() { return s_.begin(); }
  iterator end() { return s_.end(); }
  const_iterator begin() const { return s_.begin(); }
  const_iterator end() const { return s_.end(); }

  // or to hide the pointers
  typedef boost::indirect_iterator< std::vector<my_stuff*>::iterator > iterator;
  iterator begin() { return boost::make_indirect_iterator(s_.begin()); }
  iterator end() { return boost::make_indirect_iterator(s_.end()); }
private:
  std::vector<my_stuff*> s_;
};
于 2012-07-18T15:16:46.730 に答える
0

説明したように、メンバー変数を定義できます。クラス宣言の上に、前方宣言を提供するだけです。

class Modul;

これは、そのようなクラスがどこかで定義されることをコンパイラに知らせるためです。

メンバー変数は、同じクラス内の別の関数からアクセスされるため、パブリックである必要はありません。

そして、メンバーを次のように宣言するだけです:

std::vector<Modul*>   parrDigOut; //No need of pointers

ただし、スマート ポインターを使用して、親クラスがスコープ外になったときに確実に削除されるようにすることを考えることができます。

于 2012-07-18T15:17:10.487 に答える