コメントであなたはそれを説明します
「エラーが発生しました: `Shape::Shape()' への未定義参照」
これは、そのコンストラクターの実装を提供するのを忘れたことを意味します。
技術的な問題が修正されたので、設計を見てみましょう。
最初の 2 つのメソッドには 2 つの問題があります: (1) オブジェクトを変更するべきではありませんが、宣言されていconst
ないため、オブジェクトに対して呼び出すことはできません。const
(2)get
接頭辞によって読みやすさが低下し、タイプする必要があり、一般的なものはありません。アドバンテージ。get
いくつかのまれな状況では、あいまいさを解消するデバイスとしてプレフィックスが役立つことがわかりましたが、初心者が見たすべての使用法は、Java 規則の不適切なコピーであり、Java では意味がありますが、C++ では意味がありません。だから、代わりに…
virtual double getArea();
virtual void printDraw();
行う
virtual double area() const;
virtual void print() const;
では、方法は…
bool isLegal(Shape shape);
多くの点で間違っています…痛い!しかし、純粋に技術的なことから始めましょう。
純粋に技術的な観点からは、引数を値で渡すのは不必要に非効率的であり、呼び出しごとにコピー操作が発生します。代わりに、参照によってオブジェクトを渡します。オブジェクトと右辺値オブジェクトを引数としてconst
サポートするために、それを への参照にします。const
bool isLegal(Shape const& shape);
次に、naming:isLegal
は不適切な名前です。これは、ほとんどの C++ オブジェクトが有効であるためです。違法になるためには、たとえば、ポルノであり、西洋以外の国に住んでいる必要があります. そして、オブジェクトをポルノグラフィーにしたり、特定の地理的地域に配置したりする方法は、一生考えられません。
そう、
bool isValid(Shape const& shape);
次に、低レベルの設計です。非メソッドを通常のメンバー関数として持つ正当な理由はありませんvirtual
。オブジェクトで呼び出す必要があるからです。しかし、必要な情報はすべて通常の引数にあります。この混乱は、派生クラスで確認できます。ここでは…
bool isLegal(Trig trig);//override
はまったくオーバーライドではありません。技術的には関数名のオーバーロードです。つまり、同じ名前の別の関数です。ここには仮想性はなく、オーバーライドもありません。そして、それは必要ありません。
したがって、static
オブジェクトで呼び出す必要のないメンバー関数にします。
static bool isValid(Shape const& shape);
最後に、より高いレベルの設計である C++ コンストラクターとデストラクタの全機構は、そのようなメソッドとチェックを回避するために存在します。
アイデアは、あなたが…
その後、オブジェクトは単に無効になることはありません。このアプローチは単相構築と呼ばれ、それを「有効」にするオブジェクトのプロパティは、クラスのクラス不変量として知られています。これは、すべてのコンストラクターによって確立され、すべてのメソッドによって維持される必要があります。
これは、最終バージョン、isValid
関数IS REMOVEDを意味します。その仕事はコンストラクターとメソッドによって(適切に)行われるため、実行する仕事はありません。
さて、単一フェーズの構築には技術的な課題がいくつかあります。特に、基本クラスのコンストラクターで派生クラス固有の初期化を行う方法です。これはC++ FAQでカバーされています。多くの場合、FAQ を読むことをお勧めします。