私が扱っている巨大な C++ コード ベースがあります。
新しいサブクラスを導入して、さまざまなコンテキストで使用したいのですが、Java で訓練された私の心は C++ でこれに問題を抱えています。
コードの変更を最小限に抑えたい。したがって、関心のあるメイン クラス (BAR
以下) には、 class のメンバー変数がありますFOO
。FOO
というサブクラスを作りたいFOOSUBCLASS
です。Java では、これは些細なことです。デフォルトでは、オブジェクトは参照によって保存されます。このコードは (以下に示すように) インターフェイスを変更せずに (参照を導入せずに) このコードを操作しても、アプリケーションを機能させることができますか?
class FOO {
};
class FOOSUBCLASS : FOO {
public:
FOOSUBCLASS(const int id) {_id = id;}
private:
int _id;
};
class BAR {
public:
BAR(const FOO foo) { _foo = foo;}
private:
FOO _foo;
};
以下は私のメインです:
FOOSUBCLASS fsc(1);
BAR b(fsc);
しかし、これは VS2005 ではコンパイルできません。それは言います:
'type cast' : 'FOOSUBCLASS *' から 'const FOO &' への変換は存在しますが、アクセスできません
明らかな他のコンストラクターを追加すると、同じコンパイラエラーが発生しますBAR
BAR(const FOOSUBCLASS foo) { _foo = foo;}
FOOSUBCLASS
C++ についての私の理解は、データを class のオブジェクトにコピーすることFOO
です。(代入演算子、またはそのクラスオーバーライドバージョンを使用)しかし、私の場合、追加のメンバー変数FOOSUBCLASS
(およびいくつかのオーバーライドされたメンバー関数)があるので、それをしたくありません。メンバー変数が、一部のコンテキストや他のコンテキストで_foo
真の型であることを望みます。これは可能ですか?FOOSUBCLASS
FOO
ご意見ありがとうございます。