C++でのオーバーロードされたコンストラクタを持つオブジェクトの動的割り当て[closed]
-
23-12-2019 - |
質問
C++でオーバーロードされたコンストラクタを持つオブジェクトを動的に割り当てるための構文は何ですか?
クラスFooがある場合:
class Foo{
public:
Foo(string str, int nbr); // Overloaded constructor
};
そして、2番目のクラスFoo2(Fooを使用):
#include "Foo"
class Foo2{
public:
Foo* myFoo; // Wrong!
Foo2(){
myFoo = new Foo(myStr, myNbr);
}
};
表示されるエラーは次のとおりです :
"Foo::Foo()"への呼び出しに一致する関数がありません
MyFooオブジェクトポインタを作成するときに、それが使用することを指定するにはどうすればよいですか Foo(string str, int nbr)
コンストラクタではなく、 Foo()
コンストラクタ。
コンストラクタ委任を使用せずに可能ですか?
解決
オブジェクトを構築するための構文は正しいです。
あなたがエラーを言っていないので、確かに言うのは難しいですが、私の推測では、あなたの問題はコンストラクタが次のようになっているというこ プライベート.つまり、クラスの外でコンストラクタを使用することはできません。
エラーメッセージに関する編集:
コンパイルする完全な例を次に示します。私はエラーを生成するいくつかの例の行を追加しました:'Foo::Foo()'への呼び出しに一致する関数はありません。
#include <string>
class Foo{
public:
Foo(std::string str, int nbr);
};
// empty definition
Foo::Foo(std::string str, int nbr) {}
// delegating constructor (c++11 feature)
// this would produce error: no matching function for call to 'Foo::Foo()'
//Foo::Foo(std::string str, int nbr) : Foo::Foo() {}
int main() {
Foo* myFoo;
myFoo = new Foo("testString", -1); // this is correct
// trying to construct with default constructor
//Foo myFoo2; // this would produce error: no matching function for call to 'Foo::Foo()'
//Foo* myFoo3 = new Foo(); // so would this
}
エラーが発生した場合、コードはデフォルトのコンストラクターを使用しようとしています どこかで.
あなたの新しいについてのedit2 Foo2
例を挙げてみます。Foo*の宣言とコンストラクタの呼び出しはまだ正しいので、メソッドの可視性とセミコロンの欠落を修正するとコードがコンパイルされるはずです。次の例でコンパイルします:
#include <string>
class Foo{
public:
Foo(std::string str, int nbr); // Overloaded constructor
};
Foo::Foo(std::string str, int nbr){}
class Foo2{
Foo* myFoo; // This is still correct
public:
Foo2() {
myFoo = new Foo("", 1);
}
};
int main() {
Foo2 foo2;
}
他のヒント
構文は正しいです。完全なクラス定義を書いていないので、多くの可能性があります。1.デフォルトのcnstsructorが書き込まれているかどうかを確認します。2.両方のコンストラクタがpublicセクション内にあるかどうかを確認します。3.または、以下のようにコンストラクタへの呼び出しを変更することもできます,
Foo* myFoo = new Foo("testString", -1);
次のコードが動作するはずです。
class Foo
{
string str;
int num;
public:
Foo(string p_str, int nbr):str(p_str),num(nbr){}; // Overloaded constructor
Foo() {}; // Default constructor
};
正しい方法は、各コンストラクターのメンバーを初期化することです。プライベートinit()メンバー関数で共通のコードを抽出し、次のように各コンストラクタで呼び出すことができます:
class Foo {
public:
Foo(string x);
Foo(string x, int y);
...
private:
void init(string x, int y);
};
Foo::Foo(string x)
{
init(x, int(x) + 3);
...
}
Foo::Foo(string x, int y)
{
init(x, y);
...
}
void Foo::init(string x, int y)
{
...
}