2017-05-20 10 views
0

こんにちは私は大学での私のコースの仕事に少し問題があります。 私はOrganizationという2つの子クラスと、InsuranceとManufacturemという2つの親クラスを持っています。また、Dequeというコンテナもあります。クラス保険にはstatutory_capitalというフィールドがあります。それはfloatです。私の仕事は、statutory_capitalを持つorganisationを表示することです。 Deque.h子クラスの変数へのアクセスをgetterの親クラスで初期化せずに取得する方法

Organisation.h

#pragma once 
#include "Organisation.h" 
struct Node 
{ 
    Node *Next; 
    Organisation* data; 
}; 

class Deque 
{ 
public: 
    void Do_request(); 
private: 
    Node *Front; 
    Node *Back; 
}; 

:ここ

#pragma once 
#include <string> 
using namespace std; 

class Organisation 
{ 
protected: 
    int workers; 
    string name; 
    float experience; 
    //float statutory_capital; If I uncomment this and get_statutory_capital everything works 
public: 
    Organisation(); 
    Organisation(string Name, float Experience, int Workers); 
    virtual void show() = 0; 
    virtual string get_name(); 
    virtual int get_workers(); 
    //virtual float get_statutory_capital(); 
}; 

は、ユーザによって書かれたよりも、法定資本金organisations詳細を見つけるための方法Do_request()次のとおりです。

void Deque::Do_request() 
{ 
    if (Front == NULL) 
    { 
     cout << "The deque is empty" << endl; 
     return; 
    } 
    Node *temp = Front; 
    Insurance tmp; 
    Insurance *ptr_insurance; 
    float test_statutory_capital; 
    cout << "Write the statutory capital to find: "; 
    cin >> test_statutory_capital; 
    while (temp != NULL) 
    { 
     ptr_insurance = new Insurance(temp->data); 
     cout << "TESt" << tmp.get_statutory_capital(); 
     if (ptr_insurance != NULL) 
     { 
      if (tmp.get_statutory_capital() > test_statutory_capital) 
      { 
       cout << "Insurance with capital more than test: "<< temp->data->get_name() << "\n"; 
      } 
     } 
     temp = temp->Next; 
    } 

} 

は、私は何をすべきを追加しないでください変数statutory_capital私の親にclass組織、私はここでそれを必要としない、私のクラスの原因製造業は法定資本を持っていません。ありがとう!

+0

代わりに[mcve]が表示されますか? – IInspectable

+1

Organizationには、0を返す関数しか必要ありません。変数を返す関数でInstitutionをオーバーライドすることができます。 –

+0

はい、30分で追加します – Mark

答えて

0

あなたの割り当ては難しいです。 Insuranceにはstatutory_capitalしかありませんが、保険であるかどうかを知らずに組織が所持している法定資本を調べる必要があります。だからここに矛盾がある。一方で、基底クラスはの具体的なの派生クラスについて知識を持つべきではありません。一方で、束の基本クラスポインタだけを持つ特定の派生クラスに関する情報を見つける必要があります。

そこにはいくつかの解決策がありますが、それらはすべて異なるトレードオフを伴います。

法定資本に関する知識を基本クラスに導入することができます。推奨される方法は、仮想関数get_statutory_capital()を追加することです。デフォルト実装では、0(または負の数で、この組織に法定資本の概念がないことを示します)が返されます。関連する派生クラスは、適合していると見なして、それを上書きします。この欠点は、子クラス固有の機能をインターフェイスに追加するにつれ、潜在的に制御不能になる基本クラスです。

組織のタイプは実行時に確認できます(例:dynamic_castなど)。この特定の組織が法定資本を保有している場合は、それを処理します。そうでない場合は、そのままにしておきます。これを行うための推奨方法は、公開クラスの純粋仮想メソッドget_statutory_capital()を持つ特別クラスHas_statutory_capitalを作成することです。 statutory_capitalを持つすべての組織にこの基本クラスを追加します。これの欠点は、dynamic_castを使用しなければならないため、設計がより複雑で扱いにくくなります。

法定資本を持つ組織を別のリストに保つことができます(やはりHas_statutory_capitalから派生しています)。これにより、設計がより複雑になります。

あなたのクラスvisitableを作成し、法定資本の情報を処理するためにVisitorパターンを使用することができます。欠点はビジターパターンの通常の欠点であり、循環的な依存性です。

これのほとんどは、あなたの頭の上に行く場合は、心配とちょうど最初のソリューションを使用しないでください。

関連する問題