私はC++の専門家ではなく、物事の仕組みを直感的に把握していません。私はこれが簡単な質問だと思う。私はオブジェクトを他のオブジェクトに渡すのに問題があります。私はポインタや参照を渡すことを避けることを望むでしょう。初期化されたオブジェクトがセットアップされると、タイトなループで何百万回も呼び出します。私はコマンドパターンのようなものだと思う。ここに問題の核心があります。私のヘッダコードのようなものされています簡単な質問:状態を持つオブジェクトを渡す、C++
class ObjectWithState {
public:
ObjectWithState(int state) { // This constructor creates the problem!
state_ = state; // everyting works with no constructor.
}
private:
int state_;
};
class TakesObject {
public:
TakesObject(ObjectWithState obj) {
obj_ = obj;
}
private:
ObjectWithState obj_;
};
マイmain()
関数は次のようになります。
test.h: In constructor 'TakesObject::TakesObject(ObjectWithState)':
test.h:14: error: no matching function for call to 'ObjectWithState::ObjectWithState()'
test.h:5: note: candidates are: ObjectWithState::ObjectWithState(int)
test.h:3: note: ObjectWithState::ObjectWithState(const ObjectWithState&)
単純な答え:
int main() {
ObjectWithState some_object(1);
TakesObject takes_object(some_object);
return 0
}
私は、次のようなエラー(G ++)を取得しますか?
コピーコンストラクタと関係があるかどうかはわかりません。もしそうなら、ObjectWithStateのクラス定義を非常にきれいで短く保つ解決策を見つけようとしています。このライブラリのユーザは、TakesObject関数が使うような小さな関数をたくさん定義しています。理想的には、ObjectsWithStateのプログラマーは単純なオブジェクトの実装に専念する必要があります。あなたの投稿をコードで
class TakesObject {
public:
TakesObject(ObjectWithState obj): obj_(obj) {
}
private:
ObjectWithState obj_;
};
、TakesObject
コンストラクタは、最初に新しいObjectWithState
を構築しようとします:おそらく私は道に迷って行くよ...あなたがやりたいことは何
幸いですが、コピーコンストラクタを宣言する必要はありません。デフォルトのコピーコンストラクタが適切です。 – rlbond
彼はコピーコンストラクタを宣言する必要があります。一度ObjectWithState(int)を宣言すると、デフォルトのコピーコンストラクタは失われます。 –
ObjectWithState() {} ObjectWithState(int state) { state_ = state; }
動作するようです。初期化リストを使うにはconstコンストラクタも必要です。任意の方法でObjectWithStateを単純化できますか? – Tristan