2014-04-03 183 views
0

所以我正在做一個矢量/矩陣處理程序,我不能重載索引運算符,我必須使用(作爲公共方法)訪問類的私人數據。代碼:問題重載[]運營商

頁眉:

#ifndef WEKTOR_HH 
#define WEKTOR_HH 

#include "rozmiar.h" 
class Wektor { 
    float skladowa[ROZMIAR]; 

    public: 
    float operator[] (int i); 

}; 


std::istream& operator >> (std::istream &Strm, Wektor &Wek); 
std::ostream& operator << (std::ostream &Strm, const Wektor &Wek); 

#endif 

Wektor.cpp:

#include "Wektor.hh" 
#include <iostream> 

float Wektor::operator[] (int i){ 
if(i<=ROZMIAR) return skladowa[i]; 
else return skladowa[ROZMIAR];} 


std::istream& operator >> (std::istream &Strm, Wektor &Wek){ 

    std::cin >> Wek[1] >> Wek[2] >> Wek[3]; 
    return Strm;} 

std::ostream& operator << (std::ostream &Strm, const Wektor &Wek){ 

    std::cout << Wek[1] << Wek[2] << Wek[3] << std::endl; 
    return Strm;} 

主營:

#include <iostream> 
#include "Wektor.hh" 
#include "Macierz.hh" 
#include "UkladRownanLiniowych.hh" 



using namespace std; 

int main() 
{ 
    Wektor w1; 
    cin >> w1; 
    cout << endl << " Wczytano: " << endl << endl; 
    cout << w1 << endl; 
} 

我也得到噸的錯誤。例如,也是困擾我的一個是:

[email protected]:~/PO/uklad$ make 
g++ -c -g -Iinc -Wall -pedantic -o obj/main.o src/main.cpp 
g++ -c -g -Iinc -Wall -pedantic -o obj/Wektor.o src/Wektor.cpp 
src/Wektor.cpp: In function ‘std::istream& operator>>(std::istream&, Wektor&)’: 
src/Wektor.cpp:11:12: error: no match for ‘operator>>’ (operand types are ‘std::istream {aka std::basic_istream<char>}’ and ‘float’) 
    std::cin >> Wek[1] >> Wek[2] >> Wek[3]; 
      ^
src/Wektor.cpp:11:12: note: candidates are: 
In file included from /usr/include/c++/4.8/iostream:40:0, 
       from inc/Wektor.hh:5, 
       from src/Wektor.cpp:1: 

爲什麼說有什麼是錯誤的>>用float作爲第二個操作符?我猜[]本身是以某種方式工作的,因爲它將其解釋爲浮點類型,但爲什麼它不能與>>進行交互?我是新來的,所以如果它是簡單明顯的抱歉,但我找不到它。 我知道這可能是由於得到/沒有得到參考,但我無法弄清楚。

回答

3

的問題是,通過價值的運營收益:

float operator[] (int i); 

當您直接通過這樣的結果給operator>>,你傳遞一個暫時的,而這個操作需要一個左值參考,一些它被允許修改。從技術上講,您不能將右值引用(臨時值)綁定到標準C++中的非常量引用。

所以,改變經營者返回一個參考:

float& operator[] (int i); 

常見的做法是,提供一個const超載,返回const參考:

const float& operator[] (int i) const; 
+0

你的常量超載有錯誤的返回類型。另外,對於足夠小的內建類型,您通常會返回值,而不是使用常量引用。 – Deduplicator

+0

@Deduplicator糟糕,剪切和粘貼失敗。儘管我會保留參考。按價值回報是不一樣的。 – juanchopanza

+0

風格和效率的問題,如果不內聯,這是我避免在這種情況下的參考(除非我寫一個模板,它是額外的工作)。我相信一個人可以在那裏開始一個很好的火焰...... – Deduplicator