単一のコンストラクターのみを使用して、C++ を使用して次のオブジェクトを作成する方法:
A x;
A y("Hello", 7);
A z(3, "Hello", 2.4);
クラス A には、オブジェクト x、y、および z の作成に対応する単一のコンストラクターが必要です。上記の 3 行は変更できません。
単一のコンストラクターのみを使用して、C++ を使用して次のオブジェクトを作成する方法:
A x;
A y("Hello", 7);
A z(3, "Hello", 2.4);
クラス A には、オブジェクト x、y、および z の作成に対応する単一のコンストラクターが必要です。上記の 3 行は変更できません。
これらすべてのオブジェクトを作成する単一のコンストラクターを持つことはできません (むしろすべきではありません)。
この理由から、正確に異なるパラメーターを取ることができるコンストラクターを持つことができます。
重要な質問は次のとおりです。
正確に何を達成しようとしていますか? これの必要性は何ですか?
問題を間違った方法で解決しようとしている可能性があります。詳細を提供していただければ、より良いお手伝いができます。
うん!!!!
とにかく、私が強制された場合 (たとえば、これが仮説的に言えば宿題の問題である場合)、ある種のバリアントを使用します。
class Variant {
public:
Variant();
Variant( int );
Variant( double );
Variant( const char * );
~Variant();
private:
union data { ... };
enum type { ... };
};
そして、空の構築を許可するデフォルトの引数とともに、それを私の恐ろしい単一のコンストラクターで使用します。
A::A( Variant p1 = Variant(), Variant p2 = Variant(), Variant p3 = Variant() );
とc++11
:
#include <iostream>
struct A
{
template<typename... Args> A(Args&&... x)
{
std::cout << "construct A\n";
}
};
int main()
{
A x;
A y("Hello", 7);
A z(3, "Hello", 2.4);
return 0;
}
C++03 では、初期化関数を使用できます。
class A
{
public:
A(int x, const char* y, double z)
{
Init(x, y, z);
}
A(const char* y, int x)
{
Init(x, y);
}
A()
{
Init();
}
private:
void Init(int x = 0, const char* y = 0, double z = 0)
{
}
};
C++11 では、コンストラクター委任を使用できます。
class A
{
public:
A(int x, const char* y, double z)
{
}
A(const char* y, int x)
: A(x, y, 0)
{
}
A()
: A(0, 0, 0)
{
}
};