私は、以下の例のような状況でクラスを設計するためのアドバイスをしたいと思います。 BおよびCオブジェクトには、数値コンポーネントがある場合とない場合があります。問題は、NumberComponentコンストラクタを選択的に呼び出す方法がないことです。これを設計するより良い方法はありますか?より良いデザインがありますがクラス設計の苦境
class NumberComponent
{
public:
//Objects which don't have a number component just store a null pointer.
//Any time we do anything here, we have to make sure p_int isn't null.
NumberComponent() : p_int(0) { }
NumberComponent(int x) { p_int = new int(x); }
~NumberComponent() { delete p_int; }
void DoSomething() { if(p_int) ++(*p_int); }
//In real situation, this will be another complex class object.
//Using an int* here to keep this class simple for example.
int* p_int;
};
//B objects may or may not have a number component.
class B : public NumberComponent
{
public:
//If hasNumberComponent is false, we'd like to call the default constructor.
//If hasNumberComponent is true, we'd like to call NumberComponent(int) constructor.
B(int x, bool hasNumberComponent) {}
int value;
};
//C objects may or may not have a number component.
class C : public NumberComponent
{
public:
//If hasNumberComponent is false, we'd like to call the default constructor.
//If hasNumberComponent is true, we'd like to call NumberComponent(int) constructor.
C(int x, bool hasNumberComponent) {}
int value;
};
int main()
{
//myList contains NumberComponent* to B and C objects
std::list<NumberComponent*> myList;
myList.push_back(new B(5, true));
myList.push_back(new C(3, true));
for(std::list<NumberComponent*>::iterator i = myList.begin(); i != myList.end(); ++i)
(*i)->DoSomething();
//These objects don't have a Number component.
B b(2, false);
C c(1, false);
return 0;
}
'B'と 'C'がNumberComponent' 'から派生した場合は、その後、彼らは**' NumberComponent'sです。だから、彼らは「数的要素を持っているかもしれないし、持たないかもしれない」と言っても意味がありません。 –
ちなみに:あなたがする必要がない限り、動的に割り当てられたオブジェクトを(つまり 'new'を介して)使用しないでください。私は、あなたのサンプルコードで 'new'を使用する理由を見ることができません! –
私はこれについてどう考えているのか少し混乱していると思います。私はいくつかのBとCオブジェクトがp_intを持っていて、DoSomething()のようなことをすることができるようにしたいと思います。他のBとCのオブジェクトは、p_intを必要とせず、DoSomething()のようなことをすることができないという点を除いて同じです。 – user987280