Ошибка компиляции: хочет указатель вместо объекта - PullRequest
0 голосов
/ 09 декабря 2011

Я получаю следующие ошибки при создании массивов из двух объектов .. Edge и Box.

error: conversion from 'const Edge*' to non-scalar type 'Edge' requested.

Я надеюсь вернуть массив Edges.

В этом заголовочном файле:

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);

Я получаю ту же ошибку, за исключением замены 'Edge' на 'Box' в следующей строке в файле без заголовка при попытке создать Box.

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

1 Ответ

4 голосов
/ 09 декабря 2011
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 является массивом, который может распадаться на тип указателя на свой первый элемент, и, поскольку это постоянная функция-член, boxEdges будет распадаться на const Edge*.


Кстати, вместо указатель в первом случае вы используете автоматический объект как:

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

Я бы посоветовал вам сделать второй параметр operator<< константной ссылкой:

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

Это позволяет избежать ненужного копирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...