2011-12-09 34 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