0

私はこのクラスを持っています:

class A : public B

保護されたフィールドを追加する必要があります:_field、Aにあり、Bにタッチ/変更できません。これで、BとAのすべての関数は、コンストラクターを除いて仮想になります。明らかに、_fieldはクラスBの一部ではありません。

_fieldを初期化する必要があります。コンストラクターがBだけの場合、どうすればよいですか?また、このようなもの:

unsigned long _field = 0;

コンパイルエラーが発生します。

私はこれを次のように解決します:

class A : public B
{
protected: 
  unsigned long _field;
public:
  void fooFunction(){
     ....do other stuff....
     static bool isInitField = false;
     if (!isInitField){
       _field = 0;
       isInitField = true;
     }
     ...rest of the function...
  }

静的を使用せずにそれを行うためのより良い方法はありますか?

ありがとう、または

4

2 に答える 2

2

A コンストラクターを使用し、初期化リストで B コンストラクターを呼び出します。この方法で、クラス A のすべてのフィールドを初期化します。

A(unsigned long i, other_paramaters oth) : B(oth),_field(i) {

}
于 2012-12-16T14:32:03.737 に答える
1

すみません、実際には私はあなたの問題を理解していません。1回限りの初期化に関する限り、コンストラクターはそれを行う場所です。しかし、提案された解決策は、あなたが何か他のものを望んでいることを示唆しています。

関数定義の static は、クラスのすべてのオブジェクトで _field を 1 回だけ変更可能にします。これは、_field を 1 回だけ変更可能にするための少し厄介なメカニズムです。

_field を初期化するだけの場合は、初期化を使用します。エステバンによる解決策で十分です。より良い使用

A(unsigned long i, other_paramaters oth) : B(oth),_field(i) { }

A(パラメータ):B(パラメータ),_field(0){}

于 2012-12-16T14:52:57.337 に答える