如何使用具有属性的类在C ++ / CX中创建复制构造函数

时间:2012-07-22 09:33:55

标签: c++ windows-runtime c++-cx

我是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”匹配参数列表和对象(该对象作为类型限定符可以防止一场比赛)。

如何正确实现复制构造函数?

感谢。

1 个答案:

答案 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的复制构造函数,因为你总是把它作为参考。