水曜日, 7月 03, 2013

プチクイズ2 - コンポジションクラスの初期化

Q

const修飾子のついたメンバ,参照指定のメンバ,オブジェクトメンバ.これらをJavaの方法と同様な初期化をコンストラクタ中で行うことはできるか?

A

出来ない.コンパイラからお叱りをうけるだけである.
以下のコードはコンパイルでも実行時でも問題ない.

#include <iostream>
#include <sstream>
using namespace std;


class InnerObject { 
private:
 int id;
public:
 InnerObject(int paramId):id(paramId){ cout << "InnerObject init " << id << endl; }
 int GetId() { return id; }
};

class MyClass {
private:
 const char* str;
 int& r;
 InnerObject in;
public:
 MyClass(const char* paramStr, int& paramR, InnerObject paramIn ):
  str(paramStr),r(paramR),in(paramIn) {
   cout << "MyClass init " << endl;
  }
 void dump();
};

void MyClass::dump() {

 ostringstream os;
 os << "str:" << str << " ";
 os << "r:" << r << " ";
 os << "In's Id:" << in.GetId() << endl;
 cout << os.str().c_str() << endl;
 
}


int main() {

 InnerObject in(20);
 string s("neko");
 int r = 3;
 MyClass m("abc",r,in);
 m.dump();

 return 0;

}

0 件のコメント: