2017-02-05 5 views
0

疑問を簡略化するため、同じ問題を強調するダミーコードをいくつか書きました。C++:親クラスの演算子関数を使用して子クラスオブジェクトの継承変数を更新する

私は+演算子のオーバーロードを持つBoxという名前のクラスを持っています。次に、Boxクラスから継承するCubeというクラスが宣言されます。私はボックスクラスで定義された+オーバーロードを使用できるようにしたい。どのCubeオブジェクトもBoxオブジェクトであり、継承された変数は継承された関数から構成可能でなければならないので、これは私にとってもっともらしいことです。現在の問題は、+演算子がCubeオブジェクトに変換できないBoxオブジェクトを返すことです。しかし、私はこれが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です。しかし、受け入れられた答えは、キューブオブジェクトを後の部分では望ましくないBoxオブジェクトに変換することになります。

編集:この質問は、コミュニティの多くの人々によって不明瞭であることが判明しました。 (申し訳ありませんが、これは私の最初の質問です)。オーバーロードされた機能で何が起こっているのかを確認してください。私はBoxクラスの+演算子の内容をCubeクラスの+演算子にコピーしたくないという考えです。 Boxオブジェクトを返すBoxクラスの+演算子と、継承された変数に対してBox +演算を実行し、Cubeクラスオブジェクトを返すCubeクラスの+演算子が必要です。あなたはボックスを取るキューブのコンストラクタを追加した場合

答えて

0

キューブはBoxから演算子を継承します。 Cubeで再度実装する必要はありません。 しかし、キューブ演算子+を削除すると、C3 = C1 + C2;にエラーが発生することがわかります。 C1 + C2の結果、ボックスタイプになり、キューブタイプに割り当てる必要があります。彼女はあなた自身に質問をするべきです:C3はキューブ型ですか? 2つのキューブを追加すると、別のキューブが追加されますか?私はそうは思わない。だからC3はBox型でなければなりません。その後、コードは私のために働く。

p.s.この[ - > [メンバー変数]も必要ありません。 operator +をメンバー関数として定義すると、すでにprivateメンバー変数にアクセスできます。

編集:ちょうど作業コード

#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 appendを読んでください。私はC3をキューブタイプにする必要があります。 –

+0

次に、私の答えをxaxxonのそれに加えなければならないので、ボックス入力を受け取る立方体のコンストラクタを実装してください。また、入力ボックスが有効なキューブであるかどうかをチェックするロジックを実装します。 – JHBonarius

+0

あなたはまだ「最高の答え」として何かをマークしていないので、あなたはまだ苦労している(または機会主義者です)と思いますので、私のために働くいくつかのコードを追加しました。 – JHBonarius

0

、その後、コードは動作します:今、コンパイラが暗黙的にCubeBoxから変換することができます

Cube(Box const &); 

ので。

ライブ

:もちろん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-> breadth、this> height)、b2(b.length、b.breadth、b.height)、b3; ' 。あなたは 'this-> height'ではなく' this> height'を持っています。コンパイラフラグに関する研究をする必要があります – Fureeish

関連する問題