@juanchopanzaが述べたように、コンストラクターを処理する「正しい」または「完璧な」方法はありません。オブジェクトを割り当て、そのフィールド/プロパティを初期化する方法はいくつかあります。
コンストラクターが別のコンストラクターを呼び出すことはお勧めしません。同じクラスで、混乱する可能性があります。
申し訳ありませんが、あなたの例がよくわかりませんでした。簡単な例を使用します。自動化されたレストランを持っている旅行セールスマンのためのこのビジネスホテルがあると仮定しましょう。
注文を受ける機械もあれば、コーヒー、パン、ケーキ、ジュースなどの料理もありますが、ワッフル、卵などの料理は準備に時間がかかります。
顧客はレストランに到着して機械に行き、注文時にいくつかのボタンを押すことができます。彼(彼女)は、他の食べ物を待っている間に、コーヒーなどのすでに準備された食べ物のいくつかを提供するように要求することがあります。彼はまた、空の皿を取り、すべてが一緒に提供されるのを待つかもしれません。
彼は後で、何よりも同じ価格で戻ることができます。
この例では、注文を受け取るマシンを表すクラスを定義します。
マイナーな構文、エラー、バグを無視し、コンストラクターとフィールドの初期化を処理するためにこのアイデアを確認してください。
// note: good idea to add an empty value to enumerations:
enum BeveragesEnum {
none,
water,
orangejuice,
milk,
coffe,
cocoa
}; // enum BeveragesEnum
enum BreadsEnum {
none,
donut,
bagel,
cherrypie,
applepie,
cake
}; // enum BreadsEnum
enum FoodEnum {
none,
ScrambledEggs,
OverEggs,
Chicken,
Waffles,
Pancakes,
Beef
}; // enum FoodEnum
class AutomatedCafeteriaClass
protected:
BeveragesEnum Beverage;
BreadsEnum Bread;
FoodEnum Food;
public:
/* constructor*/ AutomatedCafeteriaClass();
/* destructor*/ ~AutomatedCafeteriaClass();
public:
void quickGiveMeCoffe();
void wantCoffeAndBread
(
BreadsEnum aBread
);
void onlyBeverage(BeveragesEnum aBeverage);
void BeverageBreadFirstFoodLater
(
BeveragesEnum aBeverage;
BreadsEnum aBread;
FoodEnum aFood;
);
void waitForEverything
(
BeveragesEnum aBeverage;
BreadsEnum aBread;
FoodEnum aFood;
);
void wantFood
(
FoodEnum aFood;
);
public:
void prepare();
}; // class AutomatedCafeteriaClass
/* constructor*/ AutomatedCafeteriaClass::AutomatedCafeteriaClass()
{
// first assign empty values
this.Beverage = BeveragesEnum.none;
this.Bread = BreadsEnum.none;
this.Food = FoodsEnum.none;
} // constructor AutomatedCafeteriaClass
/* destructor*/ AutomatedCafeteriaClass::~AutomatedCafeteriaClass()
{
// clear by assigning empty values
this.Beverage = BeveragesEnum.none;
this.Bread = BreadsEnum.none;
this.Food = FoodsEnum.none;
} // constructor AutomatedCafeteriaClass
void AutomatedCafeteriaClass::quickGiveMeCoffe()
{
this.Beverage = BeveragesEnum.Coffe;
prepare();
}
void AutomatedCafeteriaClass::wantCoffeAndBread
(
BreadsEnum aBread
)
{
this.Beverage = BeveragesEnum.Coffe;
this.Bread = aBread;
prepare();
}
void AutomatedCafeteriaClass::onlyBeverage(BeveragesEnum aBeverage)
{
this.Beverage = aBeverage;
prepare();
}
void AutomatedCafeteriaClass::BeverageBreadFirstFoodLater
(
BeveragesEnum aBeverage;
BreadsEnum aBread;
FoodEnum aFood;
)
{
this.Beverage = aBeverage;
this.Bread = aBread;
this.Food = aFood;
prepare();
}
void AutomatedCafeteriaClass::waitForEverything
(
BeveragesEnum aBeverage;
BreadsEnum aBread;
FoodEnum aFood;
)
{
this.Beverage = aBeverage;
this.Bread = aBread;
this.Food = aFood;
prepare();
}
void AutomatedCafeteriaClass::wantFood
(
FoodEnum aFood;
)
{
this.Food = aFood;
prepare();
}
void AutomatedCafeteriaClass::prepare();
{
// prepare the food
}
コンストラクターではなく、これらすべての関数が、コンストラクターと同じようにフィールドを初期化することに注意してください。これは、「postconstructors」または「initialiazers」とも呼ばれます。
これらすべての関数を実際のコンストラクターに変換することも可能ですが、混乱する可能性があるため、各関数が独自の識別子を持っている方が簡単です。
乾杯。