2017-05-01 9 views
0

ストリーム内の抽象クラスポインタの2Dオブジェクトに対して、ストリーム>>の演算子を呼び出す方法を教えてください。ストリーム演算子と抽象クラス

すべての派生クラスのプライベートメンバーに値を基本クラスから割り当てる必要があります。出来ますか ?どうやって?

istream & operator>>(istream& input,empolye &p) 
{ 
    cout << "Enter department type:"; 
    input >> p.type; 
    cout << "Enter available bed:"; 
    input >> p.avilable_bed; 
    cout << "Enter type of empolye "; 
    input >> p.empolye_type; 
    cout << "Enter empolye name"; 
    input >> p.name; 
    cout << "Enter age"; 
    input >> p.age; 
    cout << "Enter date of join"; 
    input >> p.dateOfjoin; 
} 

誰もが私の質問を得ることができますように願っています。 ありがとうございます。

+0

はい、型、名前などは、データへの参照を提供する関数である必要があります –

+0

ありがとうMr.Richard – Nouman

+0

派生クラスには 'employee'のメンバーに加えてさらにprivateメンバーがあり、コール'std :: cin >> my_employee;'のように、ユーザーが値を入力できるようにしますか? –

答えて

0

すべての演算子のオーバーロードを基本クラスに(直接的または意味的にはfriendを介して)行います。 ではないオペレータを仮想化することについて考えてください。あなたのオペレータの実装は、employeeオブジェクトのプライベート仮想メンバ関数を呼び出す必要があります。その関数は、派生クラスがより多くの入力操作を追加するためにオーバーライドできるフックとして機能します。

クラスのパブリックインターフェイスと派生クラスからアクセス可能なカスタマイズポイントを分離するこのアプローチの基本的な考え方は、Non-Virtual Interface Idiomまたはテンプレートメソッドのデザインパターンに関連しています。

ここは例です。ので、あなたがしたい、special_employeeが再びから継承されている場合は、このアプローチはやや扱いにくくなることができます

#include <iostream> 
#include <string> 

class employee 
{ 
public: 
    virtual ~employee() {} 

    friend std::istream& operator>>(std::istream& input, employee &p) 
    { 
     std::cout << "Enter department type: "; 
     input >> p.type; 
     std::cout << "Enter available bed: "; 
     input >> p.available_bed; 
     std::cout << "Enter type of employee: "; 
     input >> p.employee_type; 
     std::cout << "Enter employee name: "; 
     input >> p.name; 
     std::cout << "Enter age: "; 
     input >> p.age; 
     std::cout << "Enter date of join: "; 
     input >> p.date_of_join; 
     p.ReadMore(input); 
     return input; 
    } 

private: 
    virtual void ReadMore(std::istream&) {} 

    int type; 
    int available_bed; 
    int employee_type; 
    std::string name; 
    int age; 
    int date_of_join; 
}; 

class special_employee : public employee 
{ 
private: 
    void ReadMore(std::istream& input) override 
    { 
     std::cout << "Enter extra data: "; 
     input >> extra_data; 
    } 

    int extra_data; 

}; 

int main() 
{ 
    special_employee my_special_employee; 
    employee& my_employee = my_special_employee; 
    std::cin >> my_employee; 
} 

:基底クラスで何もしませんが、派生クラスで何かをしているReadMore機能をよく見て、持っています別のフック機能を追加する必要があります。しかし、アプリケーションのビジネスロジックの2つ以上のレベルを持つクラス階層は、とにかくデザインが悪いことが多く、通常、コンポジションベースのデザインに切り替える必要があります。

+0

ありがとう... Christian Hackl – Nouman

+0

このテクニックは、上から下へと働くのでしょうか、または特定のクラスのためにジャンプすることもできます。 – Nouman

+0

@Nouman:仮想関数に精通していますか?そうでない場合は、もっと簡単な例でそれらを学ぶべきです... –

関連する問題