2010-08-17 4 views
0

Est-ce possible? Par exemple, si j'écrisDéclarez un objet en C++ sans le créer?

Car myCar; 

Ensuite, le constructeur sans argument de voitures est appelé. Il en résulte une erreur si seul un constructeur prend des arguments.

En Java, je peux facilement déclarer un objet et le créer plus tard en utilisant exactement la même instruction que ci-dessus.

+0

Est-ce qu'une déclaration comme "extern Car maVoiture;" faire? Plus tard, vous pourriez définir "Car myCar" par ex. Structure de voiture ( ) voiture voiture externe c; voiture c; int main() {} – Chubsdad

+0

Thx pour ur réponses :) – Nils

+0

double possible de [C++: Création d'un espace réservé uninitialized variable plutôt qu'un objet par défaut.] (Http://stackoverflow.com/questions/3291644/c -creating-an-uninitialized-placeholder-variable-plutôt-que-un-objet-défaut) – Suma

Répondre

6

Non, cela est impossible. Vous pourriez venir avec des hacks sales basés sur le placement nouveau qui peut vous rapprocher, mais je doute que vous vous intéressiez à eux.

Pourquoi voulez-vous faire cela? Peut-être y a-t-il un moyen propre de réaliser cela dans un style C++.

Si vous voulez seulement créer une variable qui pointera vers un objet plus tard, c'est ce que les pointeurs sont utilisés en C++.

auto_ptr<Car> car; 

car = new Car(xxx); 

Ou "ancienne":

Car *car = NULL; 

car = new Car(xxx); 

delete car; 

Pour trouver un élément dans un vecteur un code comme celui-ci est couramment utilisé:

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; 
    } 

Dans de nombreuses situations, vous préférez probablement aussi ne pas avoir un vecteur de voitures, mais aussi des pointeurs sur les voitures.

+0

Eh bien je dois trouver un objet à partir d'un vecteur d'objets et donc je n'ai pas besoin d'utiliser myVector [i] tout le temps, je voudrais créer une référence en premier et la boucle sur la liste et attacher l'objet au référence créée avant la boucle. – Nils

+0

Ainsi, vous pouvez utiliser car = & carsVector [i]; –

+2

@Nils Vous voudrez probablement utiliser un itérateur vectoriel au lieu d'indexer dans le vecteur: 'for (std :: vector :: iterator iter = myVector.begin(); iter! = MyVector.end(); ++ iter) ', qui vous permet d'utiliser' * iter' pour faire référence à l'objet actuel.De toute façon, vous pouvez faire une référence dans la boucle qui correspond à l'élément courant, soit 'Car & cur = myVector [i];' ou 'Car & cur = * iter;' –

7

Pour faire ce que vous avez fait en Java, vous déclarez un pointeur en C++:

Car* myCar; 
+0

Oui mais alors je dois le créer sur le tas .. – Nils

+0

Non, vous ne le faites pas. Vous pourriez faire plus tard Car otherCar; myCar = & otherCar; (aussi si vous voulez comparer à Java, les objets vivent aussi sur le tas) – nos

+0

@Nils, vous n'avez pas d'autre choix. L'écriture en C++ n'est pas la même qu'en Java. Si vous voulez que C'tor ne soit pas appelé, vous devez instancier l'objet sur le tas. –

11

Eh bien vous confondez, en Java tout est une référence (ou même vous pouvez penser à des pointeurs comme) à des objets et non les objets eux-mêmes. Alors vous avez probablement ce qu'il faut faire comme ceci:

Car* car = NULL; 

puis plus tard appeler explicitement une c'tor par:

car = new Car(params...); 

et ne pas oublier d'appeler delete après avoir fini d'utiliser l'objet voiture.

delete car; 
1

Vous pouvez également utiliser des pointeurs, par exemple

Car *myCar; 

Plus tard, vous écririez:

myCar = new Car(); 
4

Qu'est-ce que vous êtes habitué en java ne déclare pas l'objet et la création plus tard, mais en déclarant référence et créant l'objet auquel la référence fait référence plus tard. En C++, ce que vous cherchez est:

Car *MyCar; 
MyCar = new Mycar; 
0

Comme indiqué, la façon littérale pour représenter des objets java-en C++ est en utilisant des pointeurs vers des objets de classe.L'utilisation de pointeurs C++ avec la nouvelle instruction présente l'inconvénient que l'accès au tas le plus lent doit être effectué et que la suppression de l'objet doit être effectuée manuellement. En fonction de la portée, il existe d'autres solutions de type C/C++.

At-champ ou espace de noms global, vous pouvez utiliser la extern-spécificateur de déclarer un objet, défini ailleurs:

extern C c; 
<more code> 
c(1,2,3); 

(Le mot-clé extern a tendance à être rarement utilisé dans les C++).

Comme d'habitude, boost offre une solution élégante et générale avec la bibliothèque boost::optional.

Ceci peut être utilisé everwhere comme suit:

optional<int> oa; // declaration 
<more code> 
*oa=3; // construction 
Questions connexes