こんにちは。
クラスを使ってプログラミングしていて、どうしたらいいかわからなくなってしまったので質問させてください。
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について多重定義になっているようです。
なぜ多重定義になってしまうのでしょうか?
わかりにくいことがあったら言ってください。
補足等しようと思います。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
AClass にも BClass にも直接に InnerClass の宣言がない以上、AClass::InnerClass と BClass::InnerClass の両方ともその親クラスに宣言がある BaseClass::InnerClass を指します。
その一見別に見えるが同一のクラスの同一のメソッド宣言に対して複数の定義をしているのですから、多重宣言になるのは当然です。
……で合ってるかなぁ、こんなことしたことないし、仕様でこんな場合どうなるかは確認してないんだけど。
回答ありがとうございます。
なるほど
同じ親を使ってたら、同じクラス、メソッドを使っているのと同じ
ということですか。
ということは、
InnerClassはAClass/BClassそれぞれにも書かないといけないんですね。
てっきり「それぞれで定義されるものとして扱う」と思っていました。
同じのが複数書かれているとソースコードが汚くなりそうなんで
もう少しいい方法ないか考えてみようと思います。
ありがとうございました。
No.3
- 回答日時:
同じくこんな風に書いたことないし規格をざっとななめ読みした限りでは「どうなるか」も見付からなかったんだけど, 結局実体としては BaseClass::InnerClass しかないから多重定義, という解釈でいいとは思う>#2. ぶっちゃけ static なメンバのようなもの, かな. ただ, 個人的にはこんなのコンパイルエラーでいいと思う.
しかし, 何をしたいんだろう....
No.1
- 回答日時:
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__
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
範囲外の数値を代入したらエラ...
-
c++,ある関数のクラスから別の...
-
親クラスから子クラスへアクセス。
-
Javaコンストラクタthisとsuper...
-
無名パッケージからのインポート
-
内部クラスのスコープについて。
-
JTableのイベント取得方法
-
dllエクスポート時のdeclspec(d...
-
アップキャスト、ダウンキャス...
-
C#にて別クラスの関数を使いたい
-
a href="..." とServlet
-
dynamic_castの必要性
-
C# インターフェイスの実装
-
Strategyパターンを用いた実装...
-
違うクラスからの変数の共有化
-
C++/C#間での構造体の引き渡し...
-
プログラムの変数名にするとど...
-
private変数を設定(Java)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報