-1

私は C++ で多重継承をしようとしています:

class Element{
public:
    Element(): common_variable(0) {}
    int common_variable;
};

class Number:public Element, public Setupable{
public:
Number() {}
    vector<Digit> digit_vector;
};
class MultiLed:public Element, public Setupable{
public:
MultiLed() {}
    vector<Led> led_vector;
};

オブジェクト Element はインスタンス化されませんが、Multiled と Number でのコードの繰り返しを避けるために使用します。

Number : を含むマップがありmap<string,Number> mNumbers、最初の使用時に作成したいと思います:

mNumbers["blabla"].digit_vector.push_back(digit);

しかし、これはうまくいきません。Element、Setupable、および Number のコンストラクターへの呼び出しは正しく行われます。しかし、プログラムは次のように言って「push_back」呼び出しで停止します。

undefined symbol: _ZN14AcElementD2Ev

誰かがこれで私を助けることができますか?

4

5 に答える 5

1

ここには2つの問題があります

  1. アクセス制限:classすべてのメンバーはデフォルトでプライベートです
  2. コンストラクターは定義されておらず、宣言されているだけです

パッチを当てたコード:

class Element{
public:
    Element(){
        common_variable = 0;
    }
    int common_variable;
};

class Number:public Element, public Setupable{
public:
Number() {}
    vector<Digit> digit_vector;
};
class MultiLed:public Element, public Setupable{
public:
MultiLed() {}
    vector<Led> led_vector;
};
于 2012-12-03T11:33:40.607 に答える
0

デストラクタ〜Element(){}を実装するのを忘れました。これで動作します...

このばかげた間違いでみんなごめんなさい。

とにかくThx!

于 2012-12-04T10:06:11.823 に答える
0

すべてのコードを投稿したわけではないので、コードの状況を推測する必要があります。質問を更新すると、回答が更新されます。ほとんどの場合、Element で静的メンバーを宣言しました。名前は である可能性がありD2Evますが、その定義を提供するのを忘れていました。

基底クラスを定義するときは、仮想デストラクタを宣言することを忘れないでください。

class Element{
public:
    Element():common_variable(0) {
    }
    virtual ~Element(){
    }
    int common_variable;
};
于 2012-12-03T12:02:54.590 に答える
0

digit_vector はプライベートであり、そのクラスの外部にアクセスしようとしています。

于 2012-12-03T11:25:54.240 に答える
0

パブリックメソッドと変数を設定するのを忘れているだけです

class Number:public Element, public Setupable 
{
 public:
    Number(): Element(), Setupable() {}
    vector<Digit> digit_vector;
};

ところで、メンバー変数を public にすることは必ずしも良い考えではありません。digit_vector を返すメソッドを提供する必要があります。

//the method is provided in 2 soups, and there are reson for that
//even if you can omitt the "const" version, is better you keep both
const vector<Digit> & getDigits() const { return digit_vector; }
vector<Digit> & getDigits() { return digit_vector; }

または、クラスを単なる「データコンテナ」にする必要がある場合は、構造体にします

struct Number:public Element, public Setupable 
{
    //default construsctors of Element and Setupable are still called!
    //if not providing a default constructor, the compiler will create one
    //automatically calling all default constructor (including the vector's
    //one. Also digit_vector is constructed.

    vector<Digit> digit_vector;
};

struct は class と同じですが、唯一の違いは、デフォルトではメンバーがすべて public であるため、"public:" を指定する必要がないことです。良いスタイルは、クラスのみを使用し (パブリックまたはプライベートにする必要があるものを覚えておく必要があります)、動作/ロジックがほとんどないデータ コンテナーがある場合は構造体のみを使用することです。

そう書く:

class Number:public Element, public Setupable 
{
    //default construsctors of Element and Setupable are still called!
    //if not providing a default constructor, the compiler will create one
    //automatically calling all default constructor (including the vector's
    //one. Also digit_vector is constructed.

 public:
    vector<Digit> digit_vector;
};

も有効です。ただし、通常、コンストラクターを暗黙的に呼び出すことは望ましくありません。

于 2012-12-03T11:36:33.260 に答える