私は2つのクラスA
とB
を持っています。タイプB
のbclass
は、クラスA
の定数メンバーです。私がしたいのはA
にB
オブジェクトが提供されていない場合、クラスbclass
を初期値で初期化することです。このような 何か:constクラスメンバーをデフォルト値で初期化
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
class B{
public:
B(string Bs): Bstring(Bs){
cout << "B constructor: " << Bstring << endl;
}
~B(){
cout << "B destructor: " << Bstring << endl;
}
private:
const string Bstring;
};
class A{
public:
A(const B subb = B("mmmmm")): bclass(subb){
cout << "A constructor." << endl;
}
~A(){
cout << "A destructor." << endl;
}
private:
const B bclass;
};
int main(void){
A a;
cout << "doing work..." << endl;
sleep(2);
return 0;
}
出力は次のようになります(?)
B constructor: mmmmm
A constructor.
B destructor: mmmmm
doing work...
A destructor.
B destructor: mmmmm
事は、私が2つのBクラスを構築していますということだけが必要なときです! そして、何とかBコンストラクタは一度だけ呼び出され、デストラクタは二回呼び出されます...何が起こっているのですか?
EDIT 1:
@WhiZTiMの(大きな)応答を読んだ後、私は次の2回の更新を...加え
次のコードは、第二のコンストラクタが呼び出されたときについて説明:
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
class B{
public:
B(string Bs): Bstring(Bs){
cout << "B constructor: " << Bstring << endl;
}
B(const B& bobj): Bstring(bobj.Bstring + "(copy)"){
cout << "B copy constructor: " << Bstring << endl;
}
~B(){
cout << "B destructor: " << Bstring << endl;
}
private:
const string Bstring;
};
class A{
public:
A(const B& subb = B("mmmmm")): bobj(subb){
cout << "A constructor." << endl;
}
~A(){
cout << "A destructor." << endl;
}
private:
const B bobj;
};
int main(void){
A a;
cout << "doing work..." << endl;
sleep(2);
return 0;
}
出力:
B constructor: mmmmm
B copy constructor: mmmmm(copy)
A constructor.
B destructor: mmmmm
doing work...
A destructor.
B destructor: mmmmm(copy)
@WhiZTiMが私に指摘するように、コンパイラはBコンストラクタ(感謝!)への3番目の呼び出しを省略しました。
EDIT 2: 私は1 Bオブジェクトだけを望むので、ポインタを使用することをお勧めします。コードがなければなりません:
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
class B{
public:
B(const string Bs): Bstring(Bs){
cout << "B constructor: " << Bstring << endl;
}
B(const B& bobj): Bstring(bobj.Bstring){
cout << "copying an existing B object." << endl;
}
~B(){
cout << "B destructor: " << Bstring << endl;
}
private:
const string Bstring;
};
class A{
public:
A(B* subb = new B("mmmmm")): objb(subb){
cout << "A constructor." << endl;
}
~A(){
cout << "A destructor." << endl;
delete objb;
}
private:
const B* const objb;
};
int main(void){
A a1; // This will call the default B constructor.
A a2(new B("ooooo"));// This is calling a non default B object constructor.
cout << "doing work..." << endl;
sleep(2); //I need more motivation...
return 0;
}
これが出力されます:@WhiZTiM
の 'B'は定数サブクラスではないので、2を見たかもしれません。 'A'は' B'の複合オブジェクトです。 – WhiZTiM
'A(const B&subb = B(" mmmmm "))'です。あなたが 'const'オブジェクトを'動かすことができないので、 'A(const B subb = B(...))'は非常に悪い考えです...それでも良い[値渡し](http:// stackoverflowあなたの答えをありがとう。.com/questions/7592630/is-pass-by-value-a-reasonable-default-in-c11)A(B subb = B( "mmmmm")) ' – WhiZTiM