【问题标题】:operator= overload in C++C++ 中的 operator= 重载
【发布时间】:2017-01-14 15:36:25
【问题描述】:

我需要一些关于操作员分配的帮助。这是代码:

Sinusoid.h:

class Sinusoid : public Component
{   
    float fs, f, A, fi;
    int N;
    double *array;

public:
    Sinusoid(float fs, float f, float Ts, float fi, float A);
    void count(int type=1);
    void clear();
    ~Sinusoid();
    double *getArray() { return this->array; }
    double*& operator=(Sinusoid* const &rhs) {
        return rhs->array;
    };
};

ma​​in.cpp:

#include "headers.h"
int main()
{
    int N = 1000 * 2.5;
    Sinusoid *sinus = new Sinusoid(1000, 15, 2.5, (M_PI / 4), 0.7);
    double **answers = new double*[7];
    for (int i = 0; i < 7; i++) {
        answers[i] = new double[N];
    }
    //lab1
    //Zad1
    sinus->count(1);
    answers[0] = sinus;
    return 0;
    }

当我构建这段代码时,我遇到了以下问题:

C2440 '=':无法从 'Sinusoid *' 转换为 'double *' main.cpp:15

我知道我可以使用重载运算符“=”分配两个类,但我想采用类的私有成员(双 *array;)。我知道我可以通过“getArray()”方法做到这一点,但我想学习更多“美丽”的做法。希望你能帮助我。

谢谢。

【问题讨论】:

  • *answers[0] = sinus ?
  • 是的,我知道我不能使用 sinus->array 因为它是类的私有成员 - 我想使用重载运算符“=”将其分配给 answers 变量
  • 即使我做了 *answers[0] 还是一样。

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


【解决方案1】:

您的double*&amp; operator=(Sinusoid* const &amp;rhs) 操作员并没有按照您显然认为的那样做。

operator= 成员函数允许您在赋值的左侧有一个类的实例 (Sinusoid),在右侧有一个参数类型的实例 (Sinusoid*)。所以你写的会让你做:

Sinusoid* pointer = whatever;
Sinusoid object;
object = pointer;

显然这不是你想要的。 (而且可能不是你想要的。)

operator= 的返回类型对这个基本用法没有任何影响。这意味着object = pointer 的结果就是double*&amp;。所以它会让你写:

double* foo;
foo = (object = pointer);

这仍然对你想要的没有帮助。

由于answers[0] 是一个指针,因此无法为其创建自定义赋值运算符。然而,该语言有一个不同的机制可以在这里使用。您可以为您的类创建一个隐式转换运算符,以便编译器可以在合理的情况下将其转换/衰减为不同的类型。尝试将以下内容添加到您的课程中:

operator double* () {
    return rhs->array;
}

这应该适用于您想要的情况。

虽然我个人认为首先要求调用getArray() 并没有什么问题。有时,显式函数调用的清晰性可以更容易地阅读实际发生的事情。

【讨论】:

    【解决方案2】:

    试试……

    class Sinusoid : public Component {
    ...
       operator double*()  {
           return array;
       }
    

    及用法

    answers[0] = *sinus;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多