【问题标题】:Friendship and Operator+= overloading友谊和运营商=重载
【发布时间】:2019-12-11 21:37:49
【问题描述】:

所以我一直在尝试重载 += 运算符,但它在 Class Item 中不起作用我尝试只让 += 运算符成为朋友,但它说成员仍然可以访问(注释行)我的第一个问题是为什么这不起作用,所以我让整个 Order 类成为朋友,现在它可以访问数据成员但是重载仍然不起作用

这是我的代码:项目类

#pragma once
#include"Order.h"
class Item
{
    double Iprice;
public:
    friend Order ;
    //friend Order& Order::operator+=(Item);
    Item(double p =0):Iprice(p){

    }

    ~Item(void);
};

订单类别:

#pragma once
#include"Item.h"
#include<iostream>
using namespace std;
class Order
{
    double Oprice;
    int n_items;
    friend ostream& operator<<(ostream& c , Order O );
public:

    Order(double price =0, int n=0 ){
        Oprice = price;
        n_items = n;
    }

    Order& operator+=(Item I1){
        n_items++;
        Oprice += I1.Iprice;

        return (*this);
    }

};

主要功能:

#include<iostream>
#include"Item.h"
#include"Order.h"
using namespace std;


ostream& operator<<(ostream& c , Order O ){
    c<< "Total Price = " << O.Oprice << "-- item Count = " << O.n_items << endl ;

    return c ;

}
int main(){

Item t1;  
t1 = 1000;

Item t2 = 100;
Item t3 = 10;

Order ord1; 

Order ord2;
cout << (ord1 += t1);

}

提前致谢

【问题讨论】:

  • 你有一个包含循环。不能有 a.h 包括 b.hb.h 包括 a.h 。您需要设计您的类,以便包含在没有循环的层次结构中。
  • 这里可能的解决方案是使Item 不依赖于Order;给它一个公共的 getter 函数,而不是尝试与 Order 的 += 运算符交朋友

标签: c++ operator-overloading friend


【解决方案1】:

问题是 'Item.h' 试图包含 'Order.h' 而 'Order.h' 试图包含 'Item.h' 正在创建一个循环。

Item.h -> Order.h -> Item.h -> Order.h -> ...

这就是没有正确定义类 Item 和 Order 并且编译器在您尝试编译时抛出错误的原因。

要解决这个问题,您可以在 Item.h 中转发声明 Object 类,因为您没有在 Item.h 中使用 Order 类,而只是声明为朋友。前向声明在实际定义实体之前告诉编译器实体的存在。还有一些其他错误,例如没有定义 Item 类析构函数。我修复了这些,代码如下。

Item.h

class Order;

class Item
{
    double Iprice;
public:
    friend Order;
    Item(double p =0):Iprice(p){

    }

    ~Item()
    {
    }
};

Order.h

#pragma once
#include"Item.h"
#include<iostream>
using namespace std;

    class Order
    {
        double Oprice;
        int n_items;
        friend ostream& operator<<(ostream& c , Order O );
    public:

        Order(double price =0, int n=0 ) {
            Oprice = price;
            n_items = n;
        }

        Order& operator+=(Item I1) {
            n_items++;
            Oprice += I1.Iprice;

            return (*this);
        }
    };

ma​​in.cpp

#include<iostream>
//#include "Item.h" // No need to include Item.h here as Order.h in the next line internally includes Item.h
#include "Order.h"
using namespace std;

ostream& operator<<(ostream& c , Order O ){
    c<< "Total Price = " << O.Oprice << "-- item Count = " << O.n_items << endl ;

    return c ;

}
int main(){

Item t1;
t1 = 1000;

Order ord1;

cout << (ord1 += t1);
}

输出:

Total Price = 1000-- item Count = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多