クラスを設計する際に、コンストラクターに入れるものとInitに入れるものを混同します。だからあなたはこのことについてあなたの意見を述べてください。以下の私の質問を見つけてください。クラスを設計する際に、コンストラクターとInit関数にはどうすればよいでしょうか
- 万一クラスは別のInit関数がありますか?
- 「はい」の場合、クラスのクラスおよびInit関数のコンストラクタに入る必要があります。
私が理解しているように、私は一般的には(常に遅延初期化のための)Init関数を持つ傾向があります。例えば、私がConnectionPoolクラスを設計しなければならない場合、私はこれのようなものになります。
class ConnectionPool
{
string _host;
bool _isInit; //For separate Init, we need this
public:
ConnectionPool(string host)
:_host(host),
_isInit(false)
{}
void Init();
bool isInit(){return _isInit;}
}
//This will actually make connections
ConnectionPool::Init()
{
//Create few connections
//if successful
_isInit=true;
}
int main()
{
ConnectionPool cp("host");
//Few other init & wait for request
//Now I have the request
if(cp.isInit() == false)
cp.Init();
}
しかし最近、私は別のInit機能を持つことに抵抗することはできません。だから、良いことが何であるか教えてください。
これはあなた次第です。オブジェクトが初期化されていない状態にあることは理にかなっていますか?その後、init関数が適切です。そうでない場合は、コンストラクタ内のすべてを持つことができます。 'std :: fstream'のようなものは初期化されたものと初期化されていないものの両方を提供しています。 –
広く使われているC++のイディオムは[RAII](http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)です。アイデアは、独立したinitメソッドを持たずに、コンストラクタ内のすべてのリソース取得を行うことです。 – dasblinkenlight