どこにも答えが見つかりません。条件を使用して例外をスローすることで実行できますが、他に方法はありますか?
4 に答える
どのような状況でも構築できないクラスが必要な理由は明らかではありませんが、すべてのコンストラクターを作成private
し、それらの実装を提供しないことは可能です。これにより、コンパイル時の構築が妨げられます。
delete
C++11 では、すべてのコンストラクターに使用できます。
class A
{
public: // or private, doesn't matter.
A()=delete;
A(const A&)=delete;
A(A&&)=delete;
};
まあ、これはちょっとひどいハックですが、率直に言って、構築不可能なオブジェクトを定義する方法を必要とする C++ アプリケーションは、おそらくすでにひどいハックです!
class la
{
public:
virtual void oh_no_you_dont() = 0;
};
int main()
{
la an_instance;
return 0;
}
そしてGCCの下では、次のようになります。
test.cpp: 関数 'int main()' 内:
test.cpp:9: エラー: 変数 'an_instance' を抽象型 'la' として宣言できません</p>
test.cpp:2: 注: 次の仮想関数は 'la' 内で純粋であるため:
test.cpp:4: 注: 仮想ボイド la::oh_no_you_dont()
すべてのコンストラクターを非公開にすることができます。この方法では、クラスのインスタンスを作成することはできません。その後、クラスを作成するための 1 つ以上の静的ファクトリ メソッドを指定できます。これにより、ユーザーはファクトリ メソッドのみを使用できます。
クラスが構築されないようにしますか?
これは古いC++標準、例えばC++03以前のソリューションです
class A {
private:
A();
A(const A&)
A(A&&);
~A()
};
C++11、C++14、C++17、C++20 などの最新の C++ 標準を使用したソリューションを次に示します。
class A
{
A()=delete;
A(const A&)=delete;
A(A&&)=delete;
};
あるいは
class A final {
~A() = delete;
}
final
クラスを継承できないことを意味します。
delete
デストラクタの場合、クラスを破壊できないことを意味します
デストラクタを禁止すると、オブジェクトの構築もブロックされます。
オブジェクトの構築/破壊を禁止したいのはなぜですか?
非常に一般的な使用例は、開発者が C++ で「静的」クラスを作成したい場合です。
C++ の「静的」クラスは、静的メソッドのみを持つクラスを意味します。
このパターンは「util」クラスとしても知られています。
多くの人は、クラスを定義する代わりに、この目的のために関数をnamespace
含む標準を使用するようアドバイスしています。static