2011-12-09 24 views
0

我在製作兩個obecjts數組時遇到以下錯誤。邊緣和框。我想要返回一個邊數組。編譯錯誤:想要指針而不是對象

在這個頭文件:

class Box 
{ 
private: 
    bool playerOwned; 
    bool computerOwned; 
    Edge boxEdges[4]; 
    int openEdges; 
    bool full; 

public: 
    Box(); 
    Box(int x, int y); 
    void setEdges(Edge boxTop, Edge boxBottom, Edge boxLeft, Edge boxRight); 
    void addEdgeToBox(Edge edge); //add edge to edgeArray. 
    void setPlayerOwned(bool point); 
    Edge getBoxEdges() const {return boxEdges;}    ****//Error**** 
    bool getPlayerOwned() const {return playerOwned;} 
    void setComputerOwned(bool point); 
    bool getComputerOwned()const {return computerOwned;} 
    int getOpenEdges() const {return openEdges;} 
    bool isFull()const {return full;} 

}; 
std::ostream& operator<< (std::ostream& out, Box box); 

我得到除了在非頭文件試圖創建一個Box替換以下行「邊緣」與「盒子」同樣的錯誤。

Box box = new Box(x+i,y); 
+1

該聲明要求不可能。 「Box box = 」將框的*值*設置爲某物。但是「新盒子」實際上創造了一個「盒子」,而不是盒子的價值。你可以這樣做:'Box box = Box(x + i,y);',或者更簡單的'Box box(x + i,y);'。 –

回答

4
Box box = new Box(x+i,y); //error 

一個錯誤就在這裏。你應該寫爲:

Box *box = new Box(x+i,y); //ok 

這是因爲當你使用new,你分配內存,只有指針可以容納的內存,所以box必須指針類型。

同樣,

Edge getBoxEdges() const {return boxEdges;} //error 

應寫爲:

const Edge* getBoxEdges() const {return boxEdges;} //ok 

這是因爲boxEdges是一個數組,其可衰變成指針類型到其第一元件,並且因爲它是const成員功能,boxEdges將衰減爲const Edge*


順便說一句,而不是指針在第一種情況下,你可以使用自動對象爲:

Box box(x+i, y); //ok 

我會建議你做的operator<<一個const的第二個參數參考:

//std::ostream& operator<< (std::ostream& out, Box box); //don't use this 
std::ostream& operator<< (std::ostream& out, Box const & box); //use this 

這樣可以避免不必要的c OPY!

+0

我想我不明白爲什麼我應該使用一個指針,而不是僅僅使用該對象? – mcudm001

+1

@ mcudm001,它看起來像你習慣於Java/C#的「新」運營商是你如何創建一個對象。在C++中,「new」操作符在堆上分配內存,訪問它的唯一方法是通過指向內存位置的指針。在堆棧上創建一個對象是一種不同的語法。 – riwalk

+1

謝謝,那正是我的問題所在。切勿在C++之前學習Java ......或學會更好地關注。 – mcudm001