【问题标题】:How to create copy constructor in C++/CX with class having properties如何在 C++/CX 中创建具有属性的类的复制构造函数
【发布时间】:2012-07-20 21:34:53
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 为什么还需要复制构造函数? ref class 总是被引用使用,所以你总是只复制引用,不需要复制构造函数。

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


【解决方案1】:

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

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

这表明问题出在const-ness,参见例如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 的复制构造函数,因为你总是将它用作参考。

【讨论】:

  • 我正在将一些标准 C++ 移植到 C++/CX。我忘记了通过使用ref class,对象永远不会按值传递。感谢您的回答。我将省略复制构造函数。
  • 如果您希望在类上使用值语义,则在某些情况下可能适合使用“值类”。请注意,值类非常受限制;它们只能包含字符串、基本类型和其他值类。
猜你喜欢
  • 1970-01-01
  • 2020-08-11
  • 2014-04-15
  • 2019-07-11
  • 2017-03-28
  • 2017-03-27
  • 2021-01-23
  • 2021-07-11
  • 2019-08-28
相关资源
最近更新 更多