我是C ++ / CX的新手。我想创建一个具有两个属性X和Y的Vector类。
在标准C ++中,复制构造函数是:
Vector(const Vector& v);
我将其翻译为C ++ / CX:
Vector(const Vector^ v);
这是班级:
部首:
ref class Vector
{
public:
Vector();
Vector(const Vector^ v);
property double X;
property double Y;
};
实现:
Vector::Vector()
{
X = 0;
Y = 0;
}
Vector::Vector(const Vector^ v)
{
this->X = v->X;
this->Y = v->Y;
}
但是当我将v-> X分配给this-> X时出现错误:没有函数实例“Vector :: X :: get”匹配参数列表和对象(该对象作为类型限定符可以防止一场比赛)。
如何正确实现复制构造函数?
感谢。
答案 0 :(得分:3)
您的问题与copy-constructors没有直接关系。当我编译你的代码时,我收到以下错误:
'Vector :: X :: get':无法将'this'指针从'const Vector'转换为'Vector%'
这表明问题出在const
上,例如this question及其接受的答案。
似乎问题在于,对于普通属性,get
访问器未声明为const
。因此,您无法在const Vector^
上访问该媒体资源。
我认为解决方案不是使用琐碎的属性,而是自己实现两个访问器,使get
访问者const
:
private:
double x;
double y;
public:
property double X
{
double get() const { return x; }
void set(double value) { x = value; }
}
property double Y
{
double get() const { return y; }
void set(double value) { y = value; }
}
这种方法的问题在于你不能在WinRT类型中使用const
方法(我认为,这就是为什么get
访问器在普通属性中不是const
的原因。因此,如果您将类型更改为public ref class
,则会收到此错误:
'get':不支持WinRT类型成员函数的'const'和'volatile'限定符
因此,我认为您最好的选择是不要在复制构造函数中使用const
:
Vector::Vector(Vector^ v)
{
this->X = v->X;
this->Y = v->Y;
}
虽然我不确定为什么你甚至需要ref class
的复制构造函数,因为你总是把它作为参考。