これは可能ですか?たとえば、私が書いた場合
Car myCar;
次に、Car の引数を取らないコンストラクターが呼び出されます。引数をとるコンストラクタしかない場合はエラーになります。
Java では、上記とまったく同じステートメントを使用して、オブジェクトを簡単に宣言し、後で作成することができます。
これは可能ですか?たとえば、私が書いた場合
Car myCar;
次に、Car の引数を取らないコンストラクターが呼び出されます。引数をとるコンストラクタしかない場合はエラーになります。
Java では、上記とまったく同じステートメントを使用して、オブジェクトを簡単に宣言し、後で作成することができます。
Java では、すべてがオブジェクトへの参照 (またはポインタのように考えることができます) であり、オブジェクト自体ではありません。だからあなたはおそらくこのように何をすべきか:
Car* car = NULL;
その後、次の方法で c'tor を明示的に呼び出します。
car = new Car( params...);
delete
car オブジェクトを使い終わったら、忘れずに呼び出してください。
delete car;
Java で行ったことを行うには、C++ でポインターを宣言します。
Car* myCar;
いいえ、これは不可能です。新しい配置に基づいていくつかの汚いハックを考え出すことができますが、それはあなたに近づくかもしれませんが、あなたがそれらに興味があるとは思えません.
なぜそれをしたいのですか?おそらく、C++ スタイルでそれを達成するためのクリーンな方法がいくつかあります。
後で何らかのオブジェクトを指す変数を作成するだけの場合は、これが C++ で使用されるポインターです。
auto_ptr<Car> car;
car = new Car(xxx);
または「古い方法」:
Car *car = NULL;
car = new Car(xxx);
delete car;
ベクター内の項目を見つけるには、次のようなコードが一般的に使用されます。
std::vector <Car> cars;
Car *find = NULL;
for(std::vector<Car>::iterator car = cars.begin(); car != cars.end(); ++car )
for (int i=0; i<cars.size(); i++)
if (Match(*car,xxx)
{
find=car;
break;
}
多くの場合、車のベクトルではなく、車へのポインターのベクトルを使用することをお勧めします。
Java で慣れているのは、オブジェクトを宣言して後で作成することではなく、参照を宣言して、参照が後で参照するオブジェクトを作成することです。C++ では、探しているものは次のとおりです。
Car *MyCar;
MyCar = new Mycar;
ポインターを使用することもできます。
Car *myCar;
後で次のように記述します。
myCar = new Car();
説明したように、C++ で Java オブジェクトを表現する文字通りの方法は、クラス オブジェクトへのポインターを使用することです。
new ステートメントで C++ ポインターを使用すると、低速のヒープにアクセスする必要があり、オブジェクトの削除を手動で行う必要があるという欠点があります。
範囲によっては、C/C++ のようなソリューションが他にもあります。
グローバルまたは名前空間スコープでは、 extern-specifier を使用して、別の場所で定義されたオブジェクトを宣言できます。
extern C c;
<more code>
c(1,2,3);
(extern キーワードは、C++ 内ではめったに使用されない傾向があります)。
いつものように、boost はライブラリboost::optionalを使用してエレガントで一般的なソリューションを提供します。
これは、次のようにどこでも使用できます。
optional<int> oa; // declaration
<more code>
*oa=3; // construction