Cout重载为多重继承而工作

问题描述 投票:0回答:1

我有4类,分别是Vehicle,VehicleVehicle,CargoVehicle和CrewHauler。我将绘制一个图,并将数据成员放在括号内。

                                 Vehicle
                            (model, brand, year)
                        /                         \
                       /                           \
(model, brand, year, doors, seats)          (model, brand, year, capacity)
           PassengerVehicle                           CargoVehicle
                        \                         /
                         \                       /
                                 CrewHauler
                  (model, brand, year, doors, seats, capacity)

一切正常。但是,当我尝试为CrewHauler写重载运算符“ cout <CrewHauler。 getDoors()以及CrewHauler。getSeats()。我应该如何解决?这是我的代码:


using namespace std;

CrewHauler::CrewHauler(std::string brand, std::string model, int year, 
                       int doors, int seats, double capacity) : 
                       passengerVehicle(brand, model, year, doors, seats), 
                       cargoVehicle(brand, model, year, capacity)
{
}

std::ostream& operator<<(std::ostream& output, const CrewHauler& CrewHauler)
{
    output << "------- CrewHauler -------" << endl
        << "Brand: " << CrewHauler.Vehicle::getBrand() << endl
        << "Model: " << CrewHauler.Vehicle::getModel() << endl
        << "Year: " << CrewHauler.Vehicle::getYear() << endl 
        << "Doors:" << CrewHauler.getDoors() << endl
        << "Seats:" << CrewHauler.getSeats() << endl;
    return output;
}
c++ operator-overloading multiple-inheritance cout diamond-problem
1个回答
0
投票

我像这样复制了您的实体(假设使用非虚拟公共继承和公共方法),并且出现了2个编译错误。第一个是关于方法调用的歧义,因为编译器不知道要使用什么路径来到达Vechicle::getBrand,第二个是说它无法将const CrewHauler类型转换为Vehicle&类型。

class Vehicle {
public:
    int getBrand() { return 1; }
};

class PassengerVehicle : public Vehicle {
public:
    int getBrand() { return 2; }
};

class CargoVehicle : public Vehicle {
public:
    int getBrand() { return 3; }
};

class CrewHauler : public PassengerVehicle, public CargoVehicle {
public:
    int getBrand() { return 4; }
};

std::ostream& operator<<(std::ostream& _o, const CrewHauler& _h) {
    return _o << _h.Vehicle::getBrand();
}

为了解决第一个问题,我只指定了编译器达到所需getBrand方法所遵循的完整路径:_h.CargoVehicle::Vehicle::getBrand()(由于端点相同,您也可以使用_h.PassengerVehicle::Vehicle::getBrand()。]]

我不认为有一种方法可以解决第二个错误,这是由于基本方法调用所致,仅使用一个运算符重载,该重载可以同时获取您的实体类型的左值和右值,因此我将其拆分为2,一个采用非常量左值引用类型(CrewHauler&),另一个采用(非常量)右值引用类型(CrewHauler&&):

std::ostream& operator<<(std::ostream& _o, CrewHauler& _h) {
    return _o << _h.CargoVehicle::Vehicle::getBrand() << " const lvalue reference";
}

std::ostream& operator<<(std::ostream& _o, CrewHauler&& _h) {
    return _o << _h.PassengerVehicle::Vehicle::getBrand() << " rvalue reference";
}

我编写了此示例代码以对其进行测试:

auto ch = CrewHauler();
std::cout << CrewHauler() << std::endl << ch;

将按预期输出以下内容:

1右值参考1个常量左值参考

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.