2011-11-15 3 views
3

Je Vector classe, ce qui représente un point 3D, rédigé comme suit dans Vector.h:C++ instanciation

class Vector { 
    public: 
    float x,y,z; 
    Vector(float _x=0.0,float _y=0.0,float _z=0.0){x=_x;y=_y;z=_z;}; 
    operator float *() { return &x;}; 
}; 

Je déclare également extern vector<Vector>model_vertices; sur model.h

Sur un fichier model.cpp je mets en œuvre Vector.h et Déclarez une std::vector<Vector>model_vertices; globally (oui, je sais que le vecteur/Vector est confus, mais je dois utiliser le nom de vecteur pour la cohérence).

Sur model.cpp, lors de l'initialisation du contenu de ce vecteur j'utilise une boucle avec le contenu suivant:

float X,Y,Z; 

offFileStream>>X; 
offFileStream>>Y; 
offFileStream>>Z; 


Vector v=new Vector(X,Y,Z); 


model_vertices[loadVertexIndex]=v; 

Je reçois l'erreur suivante:

error C2440: 'initializing' : cannot convert from 'Vector *' to 'Vector' 

Pourquoi?

Répondre

9

L'erreur est sur cette ligne:

Vector v=new Vector(X,Y,Z); 

v est de type Vector, mais new Vector(X,Y,Z) retourne un Vector*:

Ce que vous est probablement voulu à la place seulement:

Vector v(X,Y,Z); 

Comme une note de côté, je ne vous ai pas vu initialiser une taille pour le model_vertices. Donc, vous pouvez utiliser push_back() à la place.

2
Vector v=new Vector(X,Y,Z); 
model_vertices[loadVertexIndex]=v; 

devrait être

Vector *v=new Vector(X,Y,Z); 
model_vertices[loadVertexIndex]=*v; 

new() allouée dans le tas et renvoie un pointeur vers un objet.

Si vous souhaitez appeler le constructeur et l'allouer à la pile, faites-le à la place.

Vector v(X,Y,Z); 
1

Le nouvel opérateur ne peut être utilisé lorsque asigning à un pointeur. Si vous voulez juste d'avoir un objet v d'un vecteur de type vous devez utiliser: Vector v(X,Y,Z); Si vous souhaitez avoir un pointeur vers l'objet Vector, vous devez utiliser: Vector *v=new Vector(X,Y,Z);

3

Il est pas tout à fait clair ce que vous êtes essayant de réaliser, mais peut-être que vous êtes en train de trop réfléchir.

Tout d'abord, veuillez oublier le mot-clé new. Fais juste semblant que ça n'existe pas. (Au moment où vous en aurez besoin, vous saurez suffisamment de C++ pour réaliser que vous pouvez ignorer ce message.)

Deuxièmement, vous pouvez améliorer votre constructeur de la classe à utiliser une liste d'initialiseur:

Vector(float _x = 0.0, float _y = 0.0, float _z = 0.0) 
: x(_x), y(_y), z(_z) 
{ } 

Troisièmement, pour alimenter un vecteur, il suffit d'insérer temporaires directement:

std::vector<Vector> v; 
float x, y, z; 

while (get_values(x,y,z)) // or any sort of loop you like 
{ 
    v.push_back(Vector(x,y,z)); 
} 

Si vous avez un récent version de C++, vous pouvez utiliser l'emplacement le plus efficace à la place:

v.emplace_back(x, y, z); // no temporary