2013-11-01 66 views
1

我在編程類,需要重載解釋給我。簡單的問題,希望我能很快得到答案。我的理解是,重載一個操作符允許它在一個類上使用。如果那是真的,那麼我將如何超載>>與班級一起工作?我工作的一個小程序來測試這個想法,我會後在這裏重載操作符編程練習

#include <iostream> 
#include <cstdlib> 
#include "data.h" 

using namespace std; 

int main() 
{ 
    data obj; 

    cout << "What is the Number?" << endl; 
    cin >> obj; 
    system("pause"); 
    return 0; 
} 

class data 
{ 
    public: 
    data operator >> (int); 

    private: 

}; 
+1

告訴我們你的'類data'代碼。 – Walter

+0

你想用'data'做什麼,你用什麼'''做什麼? – 0x499602D2

+0

我只是想了解超載。我試圖通過使用重載來讀入我在一個類中創建的變量。它是一個項目的一部分,我必須使用重載來讀入,輸出,比較和++/- 一天。這只是爲了證明我知道什麼超載是 – jrainey

回答

0

我想這是你想要的。

class data 
{ 
    friend istream& operator>>(istream&, data&); 

    private: 
     int data; 
}; 

istream& operator>>(istream& in, data& d) 
{ 
    return in >> d.data; 
} 
+2

不正確,朋友應該是運營商不是istream – 4pie0

1

案例1:不需要訪問私人數據

data.h. 

class data { 
    public: 
    int i; 
}; 

std::ostream& operator>> (std::istream&, data&); // better make operator >> 
               // a nonmember function 
               // if it doesn't need access 
               // to private data 

data.cpp

#include "data.h" 

std::istream& operator>> (std::istream& is, data& d) { 
    is>>d.i; // here we do some logic, we do what it means to do >> on 
    return is; // an instance of your data class and return reference to istream 
} 

情形2:有必要訪問私人數據

data.h. 

class data { 
    private: 
    int i; 
    friend std::ostream& operator>> (std::istream&, data&); 
}; 

data.cpp

#include "data.h" 

std::istream& operator>> (std::istream& is, data& d) { 
    is>>d.i; // here we do some logic, we do what it means to do >> on 
    return is; // an instance of your data class and return reference to istream 
} 
+0

謝謝,這指出我在正確的方向。讚賞 – jrainey

1

This page告訴你,主要是你需要知道的關於運算符重載的一切。

簡而言之,C++中的幾乎每個運算符都可以爲用戶定義的類型重載。有些運算符(如+, - 或>>)必須在類之外定義,因爲它們是獨立的,而其他像複製賦值(=)的運算符必須在其中定義。

對於你的情況,超載>>操作員可以通過以下方式來完成:

istream& operator>>(istream& in, data& d){ 
    // Code here 
    return in; 
} 

它說:「代碼在這裏」,將你需要讀入的數據對象的代碼。

例如,假設我們正在讀入帶有x座標和y座標的Point對象。它的格式如下所示:「(x,y)」。運營商過載可能是這樣的:

istream& operator>>(istream& in, Point& p){ 
    char c; 
    in >> c; 
    if(c != '('){ 
     in.clear(ios_base::failbit); 
     return in; 
    } 
    in >> p.x >> c >> p.y >> c; 
    return in; 
} 

這只是一個最小格式檢查的例子,但希望它足以讓你開始。

注意的是,如果你的類成員是私有的,那麼你應該朋友在類定義的istream的操作:

class data{ 
    ... 
public: 
    friend istream& operator>>(istream&, data&); 
} 
1

如果你想支持你的什麼操作符重載是理解,認爲基本上所有對象(如「+」,「++」,「==」,「!=」等)的運算符是成員函數。

挑戰自己,認出Obj a, b; a = b;Obj a; Obj b; a.operator=(b);

重載純粹是提供了一個非默認的實現。

這裏是投給const-字符*運營商的[可怕]超載:

class BadWolf { 
    const char* m_text; 
public: 
    BadWolf(const char* text) : m_text(text) {} 

    // if you really want the original text and ask for it with this function... 
    const char* tardisTranslation() const { return m_text; } 

    // but if you try to use me as a const char*... 
    operator const char*() const { return "bad wolf"; } 
}; 

int main(int argc, const char* argv[]) { 
    BadWolf message("hello, sweetie"); 

    std::cout << "Message reads: " << (const char*)message << std::endl; 
    std::cout << "Tardis translation: " << message.tardisTranslaction() << std::endl; 

    return 0; 
}