0

私はC++で継承を学んでおり、純粋な仮想クラス、基本クラス、および派生クラスを抽象化するのは初めてです。だから私はこの以下のコードを思いついた、それは動作するが、私がc++プリンシパルを正しく実装しているかどうかはわからない。誰かが改善のために以下のコードを評価できますか?

#include <iostream>
using namespace std;

class Pizza
{
   private:
       double pCost;
       double pPrice;

   public:
       Pizza(const double& c, const double& p) : pCost(c), pPrice(p){}
       virtual ~Pizza(){}
       virtual double area() = 0;
       virtual double cost() = 0;
       virtual double price () = 0;
       virtual double profit() = 0;
       double getCost() const {return pCost;}
       double getPrice() const {return pPrice;}
};

class CircularPizza : public Pizza
{
   private:
       double radius;

   public:
       CircularPizza(const double& r, const double& c, const double& p)
        : Pizza(c, p), radius(r){}
        virtual ~CircularPizza(){}
        virtual double area(){ return (3.14 * radius * radius);}
        virtual double cost() { return area() * getCost(); }
        virtual double price() { return area() * getPrice(); }
        virtual double profit() { return price() - cost();}
};
4

4 に答える 4

1

何かを変更する場合は、cost(), price()profit()仮想化して基本Pizzaクラスで定義します。

それらはすべてエリアに依存するため、これは理にかなっています-それCircularPizzaが実際に定義されている唯一のものです。RectangularPizzaクラス、エリアあたりのコスト、エリアあたりの価格を作成する場合、利益の計算は同じになります。変更されるのはエリア自体だけです。この事実を理解することで、同じ方法でクラスを設計することができます。ここでは、領域のみが変更され、他のコードは両方に共通であり、基本クラスを使用しますCircularPizzaRectangularPizza

于 2012-08-08T22:23:12.043 に答える
1

それは大丈夫そうです...しかし、getCost()メソッドと同様にあるのは奇妙cost()です。価格と同じ...コストと価格の機能の要点全体が実装固有である場合、内部pCostpPriceメンバーへのアクセスを提供することは正しくないようです。

ネーミングだけの話なのかな。コンストラクターでコストと価格を提供するので、後でこれらを照会できるのは十分公平です。したがって、その場合、cost()およびprice()メンバーの名前には (とにかく私の目には) 意味上の問題があります。あるいは、「単価」や「総費用」のようなものかもしれません。

メンバー変数を非公開ではなく保護することを検討してください。

C++ に関しては、すべて問題ないように見えますが、これらの仮想関数がクラスを変更しない場合 (クラスの const インスタンスで呼び出すことができる方法) を除いて、これらの仮想関数は一定である必要があります。

また、完全を期すために、クラスCircularPizza::getRadius()によって提供される関数と一致するように関数を実装することもできます。Pizza

于 2012-08-08T22:24:45.643 に答える
0

宿題には、良さそうです。追加の読書については、プライベート仮想機能をいつ使用するかについてこれを検討してください。さらに、C# のように、ときどきインターフェイスを作成すると役立つことがわかりました。

于 2012-08-08T22:26:58.923 に答える
0

言及する価値のあるもう 1 つの点は、CircularPizza オブジェクトの area()、cost()、price()、および Profit() 関数は、別の派生クラスの基底クラスとして CircularPizza を使用する場合を除き、仮想である必要はないということです。 .

于 2015-07-02T15:23:31.180 に答える