2

次の例を見てください。

class A {
public:
    A(int param1, int param2, int param3) {
        // ...
    }
};

class B : public A {
public:
    B() : m_param1(1), m_param(2), m_param(3), A(m_param1, m_param2, m_param3) {
        // ...
    }
};

B b;

明らかに、「b」が作成されるとき、B のパラメータが初期化される前に A の ctor が呼び出されます。

このルールにより、クラスの初期化を簡素化する「ラッパー」クラスを作成できなくなります。

それを行うための「正しい方法」は何ですか?

ありがとう、アミール

PS: 私の特定のケースでは、パラメーターはプリミティブではありません。この例は、自分自身を説明するのに役立ちました。

4

3 に答える 3

4

A のコンストラクターを呼び出すだけです。

class B : public A
{
public:
    B() : A(1 ,2, 3)
    {
    }; // eo ctor
}; // eo class B

編集:

元の投稿に対するコメントを読むだけです。これらのことについて明確にすることが重要です:)とにかく、Bで新しいデータを作成し、Bで追跡し、Aに渡したい場合、この答えは依然として当てはまります。

class Object
{
private:
    int i;
public:
    Object(int _i) : i(_i){};
};

class A
{
public:
    A(Object* _1, Object* _2, Object* _3)
    {
    };
};

class B : public A
{
private:
    Object* _1;
    Object* _2;
    Object* _3;

public:
    B() : A(_1 = new Object(1), _2 = new Object(2), _3 = new Object(3))
    {
    };
};
于 2010-11-14T21:14:34.623 に答える
2

「パラメータはプリミティブではありません」。それで、あなたはこのようなものを持っていますか?

class Param { /*...*/ };
class A {
public:
  A(const Param& param1, const Param& param2, const Param& param3);
};

class B : public A {
public:
  B();
private:
  Param m_param1;
  Param m_param2;
  Param m_param3;
};

Bそして、 のメンバーを のコンストラクターに渡したいとしますA。これはどう?

class B_params {
protected:
  B_params(int v1, int v2, int v3);
  Param m_param1;
  Param m_param2;
  Param m_param3;
};
class B : private B_params, public A {
public:
  B();
};

B_params::B_params(int v1, int v2, int v3)
  : m_param1(v1), m_param2(v2), m_param3(v3) {}
B::B() : B_params(1,2,3), A(m_param1, m_param2, m_param3) {}

の継承されたクラスのリストのB_params前に来ていることを確認してください。AB

于 2010-11-14T21:28:29.933 に答える
0

あなたの質問が届いているかどうかわかりません。

特定のパラメーターで A を初期化するのに役立つものが必要な場合は、デフォルト値で A コンストラクターを使用する必要があります。

class A {
public:
    A(int param1 = 1, int param2 = 2, int param3 =3) {
        // ...
    }
};
于 2010-11-14T21:17:18.563 に答える