2017-02-05 4 views
0

Чтобы упростить мои сомнения, я написал некоторый фиктивный код, который подчеркивает ту же проблему.C++: использование функции оператора родительского класса для обновления унаследованных переменных объекта дочернего класса

Итак, у меня есть класс с именем Box, который имеет перегрузку для оператора +. Затем объявляется класс Cube, который наследуется от класса Box. Я хочу иметь возможность использовать + перегрузку, определенную в классе Box. Это кажется мне правдоподобным, поскольку любой объект Cube также является объектом Box, а унаследованные переменные должны быть конфигурируемы из унаследованных функций. Текущая проблема заключается в том, что оператор + возвращает объект Box, который не может быть преобразован в объект Cube. Но я не могу использовать информацию о том, что * это объект Cube.

Пример кода:

#include <iostream> 
using namespace std; 

class Box { 
    double length, breadth, height; 

public: 
    Box(); 
    Box(double l, double b, double h){ 
     length=l;breadth=b;height=h; 
    } 
    double getVolume() { 
     return length * breadth * height; 
    } 
    // Overload + operator to add two Box objects. 
    Box operator+(const Box& b) { 
     Box box; 
     box.length = this->length + b.length; 
     box.breadth = this->breadth + b.breadth; 
     box.height = this->height + b.height; 
     return box; 
    } 
}; 

class Cube: public Box { 
public: 
    Cube(); 
    Cube(double size):Box(size,size,size){} 
    Cube operator+(const Cube& b) { 
     return (Box(*this)+b); // this is wrong 
    } 
}; 

// Main function for the program 
int main() { 
    Cube C1(5),C2(10),C3; 
    C3=C1+C2; 
    cout << "Volume of C3 : " << C3.getVolume() <<endl; 
    return 0; 
} 

Я прочитал много ответов на эту тему. This, вероятно, самый близкий к этому вопросу. Но принятый ответ преобразит объект Cube в объект Box, что нежелательно в последующих частях.

РЕДАКТИРОВАТЬ: Вопрос был непонятен многим людям сообщества. (Прошу прощения, но это мой первый вопрос о стеке). Пожалуйста, не переходите к тому, что происходит в перегруженной функции. Идея заключается в том, что я не хочу копировать содержимое оператора + в класс Box в оператор + класса Cube. Мне нужен оператор + класса класса Box, возвращающий объект Box, и оператор + в классе Cube, который, помимо прочего, выполняет операцию Box + по унаследованным переменным и возвращает объект класса Cube.

ответ

0

Куб наследует оператора + из коробки. Вам не нужно реализовывать его снова в Cube. Но при удалении оператора Cube + вы заметите, что ошибка C3 = C1 + C2;. C1 + C2 приводит к типу Box, и вы хотите присвоить его типу Cube. Ее вы должны задать себе вопрос: должен ли C3 быть кубическим типом? Если вы добавите два куба, вы получите еще один куб? Я так не думаю. Таким образом, C3 должен быть Box-type. Тогда код работает для меня.

p.s.You также не нужно это -> [переменная-член]. У вас уже есть доступ к частным переменным-членам, поскольку вы определяете operator + как функцию-член.

Edit: просто добавить рабочий код

#include <iostream> 

class Box 
{ 
private: 
    double length; 
    double breadth; // ?? do you mean "width"? 
    double height; 

public: 
    Box() {} 
    Box(const double l, const double b, const double h) 
     : length(l) 
     , breadth(b) 
     , height(h) 
    {} 

    // I don't know why the members are private? But you need access to check for a cube. 
    double getLength() const { return length; } 
    double getBreadth() const { return breadth; } 
    double getHeight() const { return height; } 

    double getVolume() const 
    { 
     return length * breadth * height; 
    } 

    // Overload + operator to add two Box objects. 
    Box operator+(const Box& b) 
    { 
     return Box (
      length + b.length, 
      breadth + b.breadth, 
      height + b.height); 
    } 
}; 

class Cube : public Box 
{ 
public: 
    Cube(const double size = 0) 
     :Box(size, size, size) 
    {} 

    Cube(const Box& b) 
     : Cube(b.getLength()) 
    { 
     if ((b.getLength() != b.getBreadth()) || (b.getLength() != b.getHeight())) 
      throw std::invalid_argument("Box is not a Cube!"); 
    } 
}; 

// Main function for the program 
int main() { 
    Cube C1(5), C2(10), C3; 
    C3 = (C1 + C2); 
    std::cout << "Volume of C3 : " << C3.getVolume() << std::endl; 
    int temp; 
    std::cin >> temp; 
    return 0; 
} 
+0

Мне жаль, что я не смог придумать хороший пример, чтобы объяснить мои требования. Пожалуйста, прочитайте добавление EDIT, которое я добавил. Мне нужен C3 для типа куба. –

+0

Затем вы должны добавить свой ответ с помощью xaxxon, поэтому реализуйте конструктор куба, который принимает ввод в ящик. И реализуйте логику, которая проверяет, является ли поле ввода допустимым кубом. – JHBonarius

+0

Как вы все еще не отметили что-либо как «лучший ответ», я думаю, вы либо все еще боретесь (или оппортуниста;)), поэтому я добавил код, который работает для меня. – JHBonarius

0

Если добавить конструктор куба, который принимает коробку, то код будет работать:

Cube(Box const &); 

Поскольку теперь компилятор может неявно преобразовать из Box в Cube.

жить: https://godbolt.org/g/JMAuz2

Конечно, вы должны поставить определенную логику в новый конструктор, чтобы убедиться, что коробка на самом деле куб - вероятно бросать исключение, если это не так.

0

У меня нет той проблемы, с которой вы столкнулись, поскольку ваш вопрос неясен. Но, я думаю, это то, что вы хотите. Надеюсь, это поможет

#include <iostream> 
using namespace std; 

class Box { 
public: 
double length, breadth, height; 
Box(){} 
Box(double l, double b, double h) { 
    length = l; breadth = b; height = h; 
} 
double getVolume() { 
    return length * breadth * height; 
} 
// Overload + operator to add two Box objects. 
Box operator+(const Box& b) { 
    Box box; 
    box.length = this->length + b.length; 
    box.breadth = this->breadth + b.breadth; 
    box.height = this->height + b.height; 
    return box; 
} 
}; 

class Cube : public Box { 
public: 
Cube(){} 
Cube(double size) :Box(size, size, size) {} 
Cube operator+(const Cube& b) { 
    Box b1(this->length, this->breadth,this>height),b2(b.length,b.breadth,b.height),b3; 
    Cube t(this->breadth); 
    b3 = b1 + b2; 
    t.length = b3.length; 
    t.breadth = b3.breadth; 
    t.height = b3.height; 
    return (t); 
} 
}; 

// Main function for the program 
int main() { 
    Cube C1(5), C2(10), C3; 
    C3 = C1 + C2; 
    cout << "Volume of C3 : " << C3.getVolume() << endl; 
    return 0; 
} 
+0

код не компилируется ... – Fureeish

+0

Тогда ваш компилятор позволяет вам компилировать неверный код. Эта строка неверна 'Box b1 (this-> length, this-> widthth, this> height), b2 (b.length, b.breadth, b.height), b3;' Обратите внимание на третье слово '' this'' , У вас есть 'this> height', а не' this-> height'.Вы должны провести некоторое исследование флагов компилятора – Fureeish

Смежные вопросы