2017-05-13 12 views
-4

私は、このコードを持って、クラスシリンダーにラインC++のコンストラクタと派生オブジェクト

Cylinder(double r, double h) : base (r), height(h) {} 

Cylinder(double r, double h) : base.radius (r), height(h) {} 

ない理由を私はダブルが引き渡されているとベースがシリンダーであることを意味するだろうbase.radiusではありませんか?

// member initialization 
#include <iostream> 
using namespace std; 

class Circle { 
    double radius; 
    public: 
    Circle(double r) : radius(r) { } 
    double area() {return radius*radius*3.14159265;} 
}; 

class Cylinder { 
    Circle base; 
    double height; 
    public: 
    Cylinder(double r, double h) : base (r), height(h) {} 
    double volume() {return base.area() * height;} 
}; 

int main() { 
    Cylinder foo (10,20); 

    cout << "foo's volume: " << foo.volume() << '\n'; 
    return 0; 
} 
+1

継承または派生オブジェクトはありませんか? –

+0

実際には、基本クラスの(唯一の)コンストラクタを呼び出す必要があるからです! – 7raiden7

+1

何とか 'base'という名前に混乱していますか? –

答えて

1

まず、コードに継承はありません。第二に、Cylinderコンストラクタを呼び出すと、そのメンバが構築されます。 Circleにはデフォルトのコンストラクタがないので、Cylinderの構築中にCircleのコンストラクタが呼び出されていることを確認する必要があります。あなたは

Cylinder(double r, double h) : height(h) {} 

を持っていた場合、あなたが存在しない

Circle::Circle() 

を使用して明示的にCircleが構築されることになるコンストラクタを呼び出すいけない場合(Circleので削除したため、コンパイラはCircleの不足しているデフォルトコンストラクタ文句を言うでしょう別のコンストラクタを宣言します)。あなたが唯一の初期化子リストにCylinderのメンバーを初期化する可能性があるため、半径はCircleにプライベートであるため、また

Cylinder(double r, double h) : base.radius (r), height(h) {} 

を動作しないことができる(ベースクラスのも、メンバーは許可されません)。

+0

Thxこの文章「第二に、あなたがシリンダーコンストラクターを呼び出すと、そのメンバーが構築されます。それは私にはっきりと分かりました:=) – latrellvie

3

私はこのコードを持って、クラスシリンダーにライン

Cylinder(double r, double h) : base (r), height(h) {} 

が、それはprivateなので、機能しませんbase.radius (r)を呼び出す

Cylinder(double r, double h) : base.radius (r), height(h) {} 

ない理由を不思議に思います Circleのメンバーです。 privateになっていなくても、初期化子リストの作成中にアクセスすることはできません。
radiusを初期化するには、 Circleコンストラクタを使用するのは問題ありません。

+0

「プライベート」は唯一の理由ではありません。 'radius'を' protected'あるいは 'public'にしてみましょう。 –

+0

@BoundaryImpositionはい、あなたは正しいです。私はそれをさらに言及しました(より良い言葉遣いを持っていない)。 –

1

まず、baseの名前は非常に、非常に悪いです。あなたのCircleオブジェクトはベースではありません!

そして、いいえ、クラスはメンバー(または実際の基盤のメンバー)のメンバーを直接初期化することはできません。それは、利害の衝突、責任の混乱、感受性の混乱であろう。

クラスは、それを管理するためにインターフェイスを提供し、そのインターフェイスは、メンバーに直接アクセスするのではなく、関数で構成されています。 Circleのデータを知らせなくても変更してしまった場合、どのように混乱するでしょうか。

オブジェクトをそのコンストラクタで初期化し、そのコンストラクタに正しいと思われるものを実行させます。この場合、コンストラクタは実際にはradiusメンバを設定します。

black boxesについて読んでください。

+0

シリンダーには、上と下のベースがあります。幾何学的なPOVから命名は正常です。 –

+0

@πάνταῥεῖ:それは分かりますが、C++プログラムではまだまだひどい選択です。 –

関連する問題