7

この単純な例は、基本クラスのコンストラクターを呼び出すための C++ 構文を示しています (C++ 学習者として理解できる限り)。

class BaseClass {
protected:
  int i;
public:
  BaseClass(int x) { 
     i = x; 
  }
};

class DerivedClass: public BaseClass {
  int j;
public:
  DerivedClass(int x, int y): BaseClass(y) { 
     j = x; 
  }

ここで、基底クラスのコンストラクターは、派生クラスのコンストラクターへの名前付き引数を入力として受け取ることができます。

BaseClass()への直接入力ではない入力値でコンストラクターを呼び出したい場合はどうすればよいDerivedClass()でしょうか? x基本的に、とyDerivedClass()で複数行の作業を行い、計算された値を に渡したいと思いますBaseClass()。これはコンストラクターで行うことができますか? 代わりに、ある種の初期化メソッドを使用してこれを行う必要がありますか?

4

3 に答える 3

12

はい、それを行うことができます:

class BaseClass
{
  public:
    BaseClass(int x) : i(x) {}

  private:
    int i;
};

class DerivedClass: public BaseClass
{
  public:
    DerivedClass(int x, int y):
      BaseClass(compute(x, y)), // Neither i or j are initialized here yet
      j(x)
      {}

  private:
    static int compute(int a, int b) { return a + b; } // Or whatever
    int j;
};

compute()非静的メソッドを作成することもできますが、呼び出し時にメンバーが初期化されないDerivedClassことに注意してください。したがって、彼らの価値観に頼ることはできません。BaseClass

于 2012-04-21T16:19:37.620 に答える
3

C++11 以降を使用している場合は、ラムダ式も使用できます。

class BaseClass
{
  public:
    BaseClass(int x) : i(x) {}

  private:
    int i;
};

class DerivedClass: public BaseClass
{
  public:
      DerivedClass(int x, int y): BaseClass(
          [=]()->int
            {
                int sum = 0;
                for(int i = 0; i < x; ++i)
                {
                    sum += y + i * x;
                }
                return sum;
            }()), j(x)
      {}

  private:
    int j;
};
于 2012-04-21T16:27:41.027 に答える
2

次に、これを行うことができます:

DerivedClass(int x, int y): BaseClass(compute(x,y)), j(y) { 
     //j = x;  //use member-initialization-list ---> ^^^^
  }

int compute(int x, int y) 
{
     //your code
}
于 2012-04-21T16:19:37.990 に答える