Visual C++2012でDelegating constructorsを試す
VC++2012のNovember CTP of the C++ compilerお試しその3。
Delegating constructorsを試しましょう。
#include "stdafx.h" #include <iostream> #include <string> class Test { int data_; std::string msg_; public: Test() : Test(123) { std::cout << "Test()" << std::endl; } Test(const char* pMsg) : Test(123, pMsg) { std::cout << "Test(const char* pMsg) " << pMsg << std::endl; } Test(int val, const char* pMsg = "data") : data_(val), msg_(pMsg) { std::cout << "Test(int val, const char* pMsg) " << val << ',' << pMsg<< std::endl; } int getData() const { return data_; } const std::string getMsg() const { return msg_; } void disp() const { std::cout << getMsg() << ":" << getData() << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { Test t1, t2("value"), t3(999), t4(111, "test"); t1.disp(); t2.disp(); t3.disp(); t4.disp(); }
で、
Test(int val, const char* pMsg) 123,data
Test()
Test(int val, const char* pMsg) 123,value
Test(const char* pMsg) value
Test(int val, const char* pMsg) 999,data
Test(int val, const char* pMsg) 111,test
data:123
value:123
data:999
test:111
と表示されます。
これも残念なことにIDE上はDelegating constructorの部分にエラーマークがでます。
実際には問題なくビルド可能です。
追記
class TestのコンストラクタをexplicitにするとVCではコンパイルエラーになります。
explicit Test() : Test(123) { /* 中身は変更なし */ } explicit Test(const char* pMsg) : Test(123, pMsg) { /* 中身は変更なし */ } explicit Test(int val, const char* pMsg = "data") : data_(val), msg_(pMsg) { /* 中身は変更なし */ }
error C2664: 'Test::Test(const Test &)' : cannot convert parameter 2 from 'int' to 'const Test &'
error C2660: 'Test::Test' : function does not take 2 arguments
…
なぜダメなの?