私はこのトピックをインターネットでたくさん検索してきましたが、確固たる答えには至っていません。私は主にC#プログラマーとして、大規模なスコープで、通常はファイルの先頭近くで、関数の外部でクラスを宣言し、使用時にクラスを構築することに慣れています。
C ++に移行した後、これを複製する唯一の方法は、デフォルトのコンストラクターを使用することです。これは問題ありませんが、場合によっては、引数のないデフォルトのコンストラクターよりも引数を必要とするコンストラクターが必要です。
インターネットで解決策を探した後、いくつかのアドバイスに出くわしましたが、それらには欠点があります。
1.ポインタ
一部の人々は、目的のスコープに動的ポインターを設定し、構築時にクラスの場所を指すようにポインターを割り当てることを提案しています。
CClass* pClass = 0;
int main()
{
pClass = new CClass(1337);
delete pClass;
return 0;
}
このアプローチの問題は、後でポインターを削除することを忘れないようにする必要があることです。したがって、静的ポインターの方がはるかに「安全」です。また、ポインタがあるため、それほどではありませんが、これを行うにはわずかなメモリオーバーヘッドがあると思います。
2.とにかくデフォルトの構成を持っている
とにかくデフォルトのコンストラクターを使用することをお勧めする場合があります。これにより、クラス内のすべてがゼロになります。
class CClass
{
public:
CClass() : leetNumber(0) {}
CClass(int leetNumber) : leetNumber(leetNumber) {}
private:
int leetNumber;
};
//Defaults leetNumber to 0 through default ctor
CClass myClass;
int main()
{
myClass = CClass(1337);
return 0;
}
しかし、クラス内のすべてをゼロにすることができない場合はどうなりますか?何にも初期化できない別のクラスがそこにある場合はどうなりますか?メンバーを適切に初期化せずに、ユーザーがクラス内の関数にアクセスしようとした場合はどうしますか?(これを確認することはできますが、特にメンバーが多い場合は、コードが多すぎると思います)。
3.より小さく、よりローカルなスコープにとどまる
人々が小さな範囲にとどまり、それを必要とする可能性のある他の関数への参照としてクラスを渡し、クラスを宣言するとすぐに構築すると言われている提案があります。
class CClass
{
public:
CClass(int leetNumber) : leetNumber(leetNumber) {}
int getLeetNumber() { return leetNumber; }
private:
int leetNumber;
};
bool GetMuchNeededAmazingNumberFromClass(CClass& myClass)
{
if(myClass.getLeetNumber() == 1337)
return true;
return false;
}
int main()
{
CClass myClass = CClass(1337);
if(!GetMuchNeededAmazingNumberFromClass(&myClass);
return 1;
return 0;
}
これは、どの関数が何を必要としているかがわかるという意味では良いのですが、必要な引数が大量にある多くの外部クラスを必要とする関数を想像することができます。
他にも多くの例がありますが、信頼できる例を見つけることができないようです。特に、このようなものが素晴らしくて簡単なC#のバックグラウンドから来ています。
ありがとう。
編集:
私が求めていることについて詳しく説明しましょう。C#では、次のことができます。
public class Program
{
//See how I'm able to do this, without calling the ctor.
static AmazingClass amazing;
public static void Main()
{
//And then call the constructor when I want.
amazing = new AmazingClass(1337);
}
}
これにより、実際にクラスを作成せずにクラスを作成できます。これがC++で探しているものです。
再度、感謝します。