c++ - operator= 在 C++ 中重载

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

我需要一些运算符分配方面的帮助。这是代码:

正弦曲线.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

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

谢谢。

最佳答案

您的 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] 是一个指针,因此无法为其创建自定义赋值运算符。然而,该语言有一个不同的机制,可以在这里使用。您可以为您的类创建一个隐式转换运算符,以便允许编译器在合理的情况下将其转换/衰减为不同的类型。尝试将以下内容添加到您的类(class)中:

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

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

尽管我个人并不认为让用法首先要求调用 getArray() 有什么问题。有时,显式函数调用的清晰度可以让您更容易阅读实际发生的事情。

关于c++ - operator= 在 C++ 中重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41651724/

相关文章:

c++ - 我可以 std::forward 折叠表达式中的参数吗?

visual-c++ - 如果使用 Visual-C++ 或 gnu g++ 编译,此函数会给出不同的结果

c++ - 无法在 uint64 上正确转换我的值?

c++ - 如何在 Visual Studio 2017 中为 Windows XP 编译代码

c++ - 错误 C2678 : binary '!=' : no operator found

Python 以两种方式将 int 乘以实例

c++ - 推断大多数模板对象的参数,但在调用模板函数时与其他对象一起显式?

c++ - 我怎样才能让编译器推断出一种 nullptr?

c++ - 将代码从 C++ 移植到 C。我如何处理这个基于 vector 和范围的循环

c++ - C++运算符重载错误:在只读对象中分配成员“”