2010-04-15 5 views
-1

est pasCréation d'un objet en C++

A a = new A(); // A is a class name 

censé travailler en C++?

Je reçois:

conversion de 'A *' type non scalaire 'A' a demandé

Quel est le problème avec cette ligne de code?


Cela fonctionne en Java, non?

Aussi, quelle est la manière correcte de créer un nouvel objet de type A en C++, alors?

+6

S'il vous plaît! Allez lire un livre sur C++! Lisez à propos de l'allocation automatique vs dynamique. Btw, il n'y a pas de ramassage des ordures en C++ ... – ALOToverflow

Répondre

9

Non, ce n'est pas. La nouvelle opération renvoie un pointeur sur l'objet nouvellement créé, vous devez donc:

A * a = new A(); 

Vous aurez aussi besoin de gérer la suppression de l'objet quelque part ailleurs dans votre code:

delete a; 

Cependant, à la différence Java, il n'est normalement pas nécessaire de créer des objets dynamiquement en C++, et dans la mesure du possible, vous devriez éviter de le faire. Au lieu de ce qui précède, vous pouvez simplement dire:

A a; 

et le compilateur de gérer la durée de vie de l'objet pour vous.

Ceci est une substance extrêmement basique. Quel livre de texte C++ utilisez-vous qui ne le couvre pas?

+0

@Neil Butterworth: Je me sentais tellement confiant que c'est correct en l'écrivant. Je pense que c'est parce que c'est comme ça que nous le faisons en Java. – Moeb

+5

@cambr Java et C++ n'ont presque rien en commun, mis à part des similitudes syntaxiques triviales. Votre expérience Java ne sera pas très utile pour apprendre le C++, c'est pourquoi vous devez lire un bon livre - voir http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and- list –

+0

@cambr: Java a des abstractions C++ ne peuvent tout simplement pas s'en tirer, pour le meilleur ou pour le pire. Presque toutes les variables Java sont réellement des pointeurs, d'un point de vue C ou C++, il n'a donc pas besoin d'être spécifié. C et C++ ont à la fois des objets de données dynamiques référencés par pointeur et des objets locaux qui ne sont pas référencés par des pointeurs. Passer de Java à C++ va impliquer l'apprentissage de nouveaux concepts. –

1

Vous devez A* a= new A();

new A(); crée et construit un objet de type A et il met sur le tas. Il renvoie un pointeur de ce type.

En d'autres termes new renvoie l'adresse de l'endroit où l'objet a été mis sur le tas, et A* est un type qui est titulaire d'une adresse pour un objet de type A

Chaque fois que vous utilisez le tas avec new vous devez appeler un delete associé à l'adresse.

1

new vous obtient un pointeur vers l'objet créé, donc:

A *a = new A(); 
2

new A() renvoie un pointeur A*. Vous pouvez écrire

A a = A(); 

qui crée une instance temporaire avec le constructeur par défaut, puis appelle le constructeur de copie pour un ou mieux encore:

A a; 

qui crée juste avec le constructeur par défaut.Ou, si vous voulez un pointeur, vous pouvez écrire

A* a = new A(); 

qui vous permet plus de flexibilité mais plus de responsabilité.

+0

'A()' crée un objet temporaire avec * value-initialization *, pas nécessairement avec le constructeur par défaut. – AnT

2

Le mot-clé new est utilisé lorsque vous souhaitez instancier un pointeur vers un objet:

A* a = new A(); 

Il se réparti sur le tas .. alors que lorsque vous ne disposez pas d'un pointeur, mais juste un objet réel que vous utilisez simplement

A a; 

Ceci déclare l'objet et instancier sur la pile (il sera vivant juste à l'intérieur de l'appel)

1

En premier lieu, nouvelle retur ns un pointeur, vous devez donc déclarer le type de a comme 'A *'. Deuxièmement, contrairement à Java, vous n'avez pas besoin de parenthèses après A:

A * a = new A;