2

我是 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”的实例与参数列表和对象匹配(对象作为阻止匹配的类型限定符)。

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

谢谢。

4

1 回答 1

3

您的问题与复制构造函数没有直接关系。当我编译你的代码时,我收到以下错误:

“Vector::X::get”:无法将“this”指针从“const Vector”转换为“Vector %”

这表明问题出在const-ness 上,例如参见这个问题及其接受的答案。

似乎问题在于,对于琐碎的属性,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; }
    }

这种方法的问题是你不能const在 WinRT 类型中拥有方法(我认为这就是为什么get访问器不是const普通属性的原因)。因此,如果您将类型更改为public ref class,您将收到此错误:

'get':不支持 WinRT 类型的成员函数上的 'const' 和 'volatile' 限定符

因此,我认为您最好的选择是不要const在您的复制构造函数中使用:

Vector::Vector(Vector^ v)
{
    this->X = v->X;
    this->Y = v->Y;
}

虽然我不确定为什么你甚至需要一个复制构造函数ref class,因为你总是将它用作参考。

于 2012-07-22T12:48:33.757 回答