C ++实例化

时间:2011-11-15 02:38:09

标签: c++

我有Vector类,代表3D点,在Vector.h中编写如下:

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

我还在extern vector<Vector>model_vertices;

上声明model.h

model.cpp文件中,我实现Vector.h并声明std::vector<Vector>model_vertices; globally(是的,我知道vector / Vector的内容令人困惑,但我必须使用Vector命名来保持一致性)。

model.cpp上,初始化此向量的内容时,我使用带有以下内容的for循环:

float X,Y,Z;

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


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


model_vertices[loadVertexIndex]=v;

我收到以下错误:

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

为什么?

4 个答案:

答案 0 :(得分:9)

错误在这一行:

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

v的类型为Vector,但new Vector(X,Y,Z)会返回Vector*

你可能想要的只是:

Vector v(X,Y,Z);

作为旁注,我没有看到你初始化model_vertices的大小。因此,您可能希望使用push_back()

答案 1 :(得分:3)

目前还不太清楚你想要达到的目标,但也许你是在思考这个问题。

首先,请忘记关键字new。只是假装它不存在。 (当你需要它时,你会知道足够多的C ++来意识到你可以忽略这篇文章。)

其次,您可以改进类构造函数以使用初始化列表:

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

第三,要填充矢量,只需直接插入临时值:

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

如果你有最新版本的C ++,你可以使用更高效的安置:

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

答案 2 :(得分:2)

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

应该是

Vector *v=new Vector(X,Y,Z);
model_vertices[loadVertexIndex]=*v;
从堆中分配的

new(),它返回一个指向对象的指针。

如果要调用构造函数并在堆栈上进行分配,请改为执行此操作。

Vector v(X,Y,Z);

答案 3 :(得分:1)

新操作符只能在指向指针时使用。如果你只想拥有一个vector类型的对象v,那么你应该使用: Vector v(X,Y,Z); 如果您想要一个指向Vector对象的指针,那么您应该使用: Vector *v=new Vector(X,Y,Z);