2016-04-16 9 views
0

私のプログラムでは、以下の目的を持っていますウェイズ抽出演算子を使用する(>>)

  • 派生クラスで基本クラスの抽出演算子をオーバーロードするには:私はstatic_cast<Derived> (derived)を使ってこれを試みたが、実行時エラーに終わった。私は友人が継承されないことを知っています。私は、派生クラスのfriend関数を再宣言し、派生クラスのデータメンバーを扱うための異なる引数を使用しました。
  • 静的データメンバーを処理するには静的データメンバーの値を変更する必要があります。私はそれらを静的でないデータメンバーと組み合わせて使用​​する必要があります。静的ゲッタとセッタを使ってみました。しかし、成功することはできませんでした。ここで

以下の私のコードです:

#include <iostream> 

using namespace std; 

class Base { 
private: 
    string name; 
    int rollNum; 
public: 
    friend std::istream& operator>>(std::istream& in, Base &base); 
}; 

std::istream& operator>>(std::istream& in, Base &base) { 
    string name; 
    int rollNum; 
    cout << "Enter name: "; 
    in >> base.name; 
    cout << "Enter roll no: "; 
    in >> base.rollNum; 
    return in; 
} 

class Derived : public Base { 
private: 
    int myNumOne; 
    static int x; 
    static int y; 
public: 
    friend std::istream& operator>>(std::istream& in, Derived Derived); 
    void add(); 
    static void init(); 
    static int getX(); 
    static int getY(); 
}; 

std::istream& operator>>(std::istream & in, Derived derived) { 
    in >> static_cast<Derived> (derived); 
    cout << "Enter a number: "; 
    in >> derived.myNumOne; 
    return in; 
} 

static void Derived::init() { 
    x = 100; 
    y = 100; 
} 

static int Derived::getX() { 
    return x; 
} 

static int Derived::getY() { 
    return y; 
} 

void Derived::add() { 
    myNumOne += getX() + getY(); 
    cout << "Number = " << myNumOne << endl; 
} 

int main() { 
    Derived obj; 
    cin>>obj; 
    Derived objOne; 
    objOne.add(); 
    Derived objTwo; 
    objTwo.add(); 
    return 0; 
} 

次のように私はエラーを取得しています:

 
newmain.cpp:43:31: error: cannot declare member function 'static void Derived::init()' to have static linkage [-fpermissive] 
    static void Derived::init() { 
          ^
newmain.cpp:48:30: error: cannot declare member function 'static int Derived::getX()' to have static linkage [-fpermissive] 
    static int Derived::getX() { 
          ^
newmain.cpp:52:30: error: cannot declare member function 'static int Derived::getY()' to have static linkage [-fpermissive] 
    static int Derived::getY() { 
          ^
+0

関数定義の前にある 'static'を削除します。 –

+0

getX()、getY()、init()メソッドで '未定義の参照:: Derived :: x'を取得しました。 –

+0

'Derived :: x'と' Derived :: y'の定義を提供する必要があります。 –

答えて

1

は、それが宣言のみで必要なのは、実装時にstaticキーワードを削除します。

void Derived::init() { 
    x = 100; 
    y = 100; 
} 

スタティックも実装する必要がありますこのようとy

int Derived::x = 0; 
int Derived::y = 0; 

それを修正するために起こっているとしても、operator>>は、オブジェクトへの参照を取る必要があります。次に、これはうまくいくはずです:

std::istream& operator>>(std::istream & in, Derived& derived) 
{ 
    Base& base = derived; 
    in >> base; 
    cout << "Enter a number: "; 
    in >> derived.myNumOne; 
    return in; 
} 

最後に、これはコンパイルされますが、期待どおりにできません。あなたが本当にxy静的を持っていることを意図

#include <iostream> 

using namespace std; 

class Base { 
private: 
    string name; 
    int rollNum; 
public: 
    friend std::istream& operator>>(std::istream& in, Base &base); 
}; 

std::istream& operator>>(std::istream& in, Base &base) { 
    string name; 
    int rollNum; 
    cout << "Enter name: "; 
    in >> base.name; 
    cout << "Enter roll no: "; 
    in >> base.rollNum; 
    return in; 
} 

class Derived : public Base { 
private: 
    int myNumOne; 
    static int x; 
    static int y; 
public: 
    friend std::istream& operator>>(std::istream& in, Derived& Derived); 
    void add(); 
    static void init(); 
    static int getX(); 
    static int getY(); 
}; 

int Derived::x = 0; 
int Derived::y = 0; 

std::istream& operator>>(std::istream & in, Derived& derived) 
{ 
    Base& base = derived; 
    in >> base; 
    cout << "Enter a number: "; 
    in >> derived.myNumOne; 
    return in; 
} 

void Derived::init() { 
    x = 100; 
    y = 100; 
} 

int Derived::getX() { 
    return x; 
} 

int Derived::getY() { 
    return y; 
} 

void Derived::add() { 
    myNumOne += getX() + getY(); 
    cout << "Number = " << myNumOne << endl; 
} 

int main() { 
    Derived obj; 
    cin>>obj; 
    Derived objOne; 
    objOne.add(); 
    Derived objTwo; 
    objTwo.add(); 
    return 0; 
} 

わからない:あなたは演算子を>>手直しします。なぜ彼らarentですか?Derivedオブジェクトの属性ですか?

+0

newmain.cpp:関数 'std :: istream&operator >>(std :: istream&、Derived&)': newmain.cpp:37:12:エラー: '演算子' 'に一致しません(オペランドの型は' std :: istream {別名std :: basic_istream } 'と'派生 ') >> static_cast (派生);おかげさまで –

+0

出来た。私は、xとyにアクセスするクラスの多くのオブジェクトがあるので、xとyを「静的」に保ちたいと思っていました。クラスのすべてのオブジェクトは、実行時に変更されているデータメンバーの値にアクセスする必要があります.. @ jpo38 –