我有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'
为什么?
答案 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);