C ++中的operator = overload

时间:2017-01-14 15:36:26

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

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

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;
    };
};

main.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

我知道我可以使用重载运算符“=”分配两个类但是我想要一个类的私有成员(double * array;)。我知道我可以通过“getArray()”方法来实现它,但我想学习更多“美丽”的练习。希望你能帮助我。

谢谢。

2 个答案:

答案 0 :(得分:1)

您的double*& operator=(Sinusoid* const &rhs)运营商并没有做您认为确实如此的事情。

operator=成员函数允许您在赋值左侧创建类的实例(Sinusoid),并在参数类型的实例(Sinusoid*)上创建右边。所以你写的东西会让你这么做:

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

显然,这不是你想要的。 (可能不是你想要的东西。)

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

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

这对你想要的东西仍无济于事。

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

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

这应该适合你想要的情况。

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

答案 1 :(得分:1)

...试

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

和用法

answers[0] = *sinus;