试图重载和运算符“+”但找不到正确的类构造函数

Posted

技术标签:

【中文标题】试图重载和运算符“+”但找不到正确的类构造函数【英文标题】:Trying to overload the sum operator "+" but can't defind the class constructor right 【发布时间】:2021-01-20 12:39:56 【问题描述】:

所以我想做的是让 sum 运算符执行类的 2 个元素中的一些,但是在修改类构造函数时我遇到了问题 在这段代码中

#include<iostream>
using namespace std;

class Baza 
public:
    int a;
    int b;
    int c;

    Baza(double x, double y)
        this->a=x;
        this->b=y;
    
    
    Baza Suma(const Baza& val) const
        return Baza(a+val.a,b+val.b);
        
    
    Baza operator+(const Baza& val) const
        return Suma(val);
    

    
;


class Derivata : public Baza 
    
public:
    int o;
    int p;
    Derivata(double x, double y) : Baza(x,y)
    this->o = x ;
    this->p = y;
    
    Derivata Suma(const Derivata& val) const
        return Derivata(a+val.a,b+val.b);
    
    Derivata operator+(const Derivata& val) const
        return Suma(val);
    

    
;



ostream& operator<<(ostream& os, const Baza& val) 
    os << val.a << ',' << val.b;
    return os;


int main() 
    Baza obd1(2,3);
    cout << obd1 << endl;
    Baza obd2(4,5);
    cout << obd2 << endl;
    Baza obd3 = obd1 + obd2;
    cout << obd3 << endl;
    /*
    Derivata obiect1(5,6);
    Derivata obiect2(10,3);
    Derivata obiect3 = obiect1 + obiect2;
    cout << obiect3 << endl;
    return 0;
    */

该算法有效,为对象 ob1 和 ob2 生成正确的总和,但如果我想像这样 Baza(double x, double y) this-&gt;a=x + 5; this-&gt;b=y; 更改“Baza”构造函数 总和不会加起来。有什么想法吗?

【问题讨论】:

它就像你写的那样工作——你有obd1.a等于7obd2.a等于9,将两者加在一起7 + 9,即16,和你将它传递给Baza 构造函数,它得到16 并将5 添加到它,导致obd3.a 等于21 我怎样才能让它停止做另一个来自 Baza 的 + 5 ?就在 7 + 9 定义不执行求和的构造函数,或者调用不带参数的构造函数并设置a和b的值。 你能给我举个例子吗?我是 C++ 新手,不太懂 【参考方案1】:

我可以想到 2 种方法来解决您的问题。一个很好,按照basic rules of operator overloading完成,第二个有点合理(如果我们假设Baza构造函数绝对必须将5添加到a)。

1。根据operator+= 实现您的operator+

在此方法中,您首先实现operator +=,然后,您可以通过在operator+ 中复制来使用它。也可以通过手动编写副本来完成,这可能会产生less WTFs/minute。 最好将operator+ 实现为非成员,但我不想过多更改您的代码。

Baza& operator+= (const Baza& val)

    a += val.a;
    b += val.b;


Baza operator+(Baza val) const 
    return val += (*this);


// Baza operator+(const Baza& val) const 
   // Baza copy = *this;
   // return copy += val;
// 

2。提供另一个构造函数,它不会做任何恶作剧

注意,此方法直接修改成员,这意味着您也可以使用原始构造函数,但如果您唯一的其他构造函数对数据进行处理(并且这些事情有时是不希望的),那么使用默认构造函数仍然是个好主意.

Baza()

    a = 0;
    b = 0;


Baza operator+(const Baza& val) const
    Baza ret;
    ret.a = a + val.a;
    ret.b = b + val.b;
    return ret;

【讨论】:

我已经实现了第一种方法,效果很好,感谢您的帮助!

以上是关于试图重载和运算符“+”但找不到正确的类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

c++ 拷贝构造函数与赋值运算符重载函数的区别是

在具有智能指针的类上正确实现复制构造函数和等于运算符

YAMLException:找不到类试图调用不在模型包中的类的构造函数

c++单链表构造函数运算符重载析构函数增删查改等

4.1.7 特殊方法与运算符重载

c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)