【问题标题】:C++ override operator= to call ToInt() methodC++ 覆盖 operator= 以调用 ToInt() 方法
【发布时间】:2014-11-19 13:31:01
【问题描述】:

您好,我正在尝试重载类的赋值运算符以返回类成员(数据)。

class A{
 public:
  int32_t ToInt32() { return this->data; }
  void SetData(int32_t data) { this->data=data; }
 private:
  int32_t data;
}

我想重载 = 运算符,以便我可以执行以下操作:

A *a = new A();
a->SetData(10);
int32_t Testint;
Testint = a;

现在a 应该是10。

我该怎么做?

【问题讨论】:

  • 您不能为原始类型重载operator=()。你可以做的是为A 提供一个强制转换运算符,但是赋值应该是这样的:Testint = *a;

标签: c++ operator-overloading assignment-operator


【解决方案1】:

你不能这样做,因为a 是一个指针。您只能为自定义类型重载运算符(并且指针是不是自定义类型)。

但是无论如何在这里使用指针都是无稽之谈。您可以进行以下工作:

A a = A{};
a.SetData(10);
int32_t Testint;
Testint = a;

为此,您需要重载implicit-conversion-to-int32_t 运算符,而不是operator=:

public:
    operator int32_t() const { return data; }

关于代码风格的一句话:使用 setter 通常是一个非常糟糕的主意——在构造函数中初始化你的类。并且不要在未初始化变量的情况下声明变量。所以你的代码实际上应该是这样的:

A a = A{10};
int32_t Testint = a;

……两行而不是四行。 A 的定义也变得更简单了:

class A {
public:
    A(int32_t data) : data{data} {}

    operator int32_t() const { return data; }

private:
    int32_t data;
};

【讨论】:

  • 这很好用——但我需要一个指针,因为在我的程序中我有一个指向对象的指针数组。我采用数组的元素(指针),并且可以使用类的 ToInt 函数。是否有可能通过运算符重载来做到这一点?
  • @Haselnussstrauch 就像我说的那样,这是不可能的。此外,您几乎可以肯定不需要在数组中使用指针,也不应该使用它们。指针在 C++ 中被过度使用。
  • @Haselnussstrauch 当然可以,但是(a)运算符仍然无法处理指针,您正在取消引用它; (b) 真的,不要在这里使用指针。 Stack Overflow 上有几个讨论非常详细地解释了为什么这是一个坏主意。
【解决方案2】:

您需要提供转换运算符:

class A{
...
    operator int32_t() const 
    { 
       return this->data;
    }
};

任何转换运算符都实现为:

operator DATATYPE()
{
    return ...;
}

这种转换运算符的返回类型是DATATYPE 本身(因此在上面给出的代码中为int32_t)。 由于此转换运算符不会(不应)更改此实例的内容,因此应将其声明为 const。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2010-11-29
    • 2022-01-23
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多