プロが教えるわが家の防犯対策術!

こんにちは。
クラスを使ってプログラミングしていて、どうしたらいいかわからなくなってしまったので質問させてください。

1つのクラスを2つのクラスが継承している状態で、多重定義エラーが出てしまっています。

----------
base.h

class BaseClass {
public:
BaseClass();
~BaseClass();
protected:

class InnerClass {
public:
InnerClass();
virtual ~InnerClass();
}
};
----------
Aclass.h

class AClass : public BaseClass {
public:
AClass();
~AClass();
};
----------
BClass.h

class BClass : public BaseClass {
public:
BClass();
~BClass();
};
----------

上記状態で、AClass.cpp、BClass.cpp内で
AClass::InnerClass::~InnerClass()
{
}

のようにコンストラクタやデストラクタ等を作っています。
BaseClass.cppにはInnerClassに関するものは書いていません。

「AClassのInnerClassのデストラクタ」というような書き方だと思うのですが、

BClass.o: multiple definition of 'BaseClass::InnerClass::~InnerClass()'
AClass.o: previous definition here
のように、後にビルドしたものがBaseClassについて多重定義になっているようです。

なぜ多重定義になってしまうのでしょうか?

わかりにくいことがあったら言ってください。
補足等しようと思います。
よろしくお願いします。

A 回答 (3件)

AClass にも BClass にも直接に InnerClass の宣言がない以上、AClass::InnerClass と BClass::InnerClass の両方ともその親クラスに宣言がある BaseClass::InnerClass を指します。


その一見別に見えるが同一のクラスの同一のメソッド宣言に対して複数の定義をしているのですから、多重宣言になるのは当然です。

……で合ってるかなぁ、こんなことしたことないし、仕様でこんな場合どうなるかは確認してないんだけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なるほど

同じ親を使ってたら、同じクラス、メソッドを使っているのと同じ
ということですか。

ということは、
InnerClassはAClass/BClassそれぞれにも書かないといけないんですね。
てっきり「それぞれで定義されるものとして扱う」と思っていました。

同じのが複数書かれているとソースコードが汚くなりそうなんで
もう少しいい方法ないか考えてみようと思います。

ありがとうございました。

お礼日時:2014/06/25 15:40

同じくこんな風に書いたことないし規格をざっとななめ読みした限りでは「どうなるか」も見付からなかったんだけど, 結局実体としては BaseClass::InnerClass しかないから多重定義, という解釈でいいとは思う>#2. ぶっちゃけ static なメンバのようなもの, かな. ただ, 個人的にはこんなのコンパイルエラーでいいと思う.



しかし, 何をしたいんだろう....
    • good
    • 0
この回答へのお礼

遅くなりましたが、回答ありがとうございました。

お礼日時:2014/07/09 11:42

base.hはインクルードガードしていますか?

この回答への補足

状態の説明漏れすみません
それぞれの**.hはインクルードガードしています。
----------
base.h

#ifndef __BASE_H__
#define __BASE_H__
...
#endif // __BASE_H__

----------
AClass.h/BClass.h

#ifndef __ACLASS_H__ // または、__BCLASS_H__
#define __ACLASS_H__ // または、__BCLASS_H__
...
#endif // __ACLASS_H__ // または、__BCLASS_H__

補足日時:2014/06/25 15:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!