Проблема с указателем и массивом - PullRequest
1 голос
/ 19 августа 2011

В C ++ у меня проблемы с указателями и т. Д. Как я могу исправить следующую проблему?

ошибка: нет совпадения с 'operator =' в ' (stage->Stage :: tile + ((unsigned int) (((unsigned int) t) * 12u))) = (оператор new (12u), (, ((Tile *)))) '|примечание: кандидаты: Tile & Tile :: operator = (const Tile &) | *

stage.h

#include "Tile.h"

class Stage {
    public:
        Tile *tiles;
        int size;
        void init(int size);
};

stage.cpp

void Stage::init(int size) {
    this->size = size;
    this->tiles = new Tile[size];
}

application.cpp

#include "Stage.h"
#include "Tile.h"

bool setTiles( Stage * stage ) {

    for( int t = 0; t < stage->size; t++ ) {
        stage->tiles[t] = new Tile();
    }

    return true;
}

stage.init(1234);
setTiles( &stage );

Кроме того, я действительно не знаю, когда использовать object.attribute и когда использовать object->attribute?

Ответы [ 4 ]

6 голосов
/ 19 августа 2011
stage->tiles[t] = new Tile();

Вы называете новым что-то, что не является указателем.Правда, плитка является указателем на массив, однако каждый элемент этого массива НЕ является указателем.Для этой работы вам понадобится массив указателей или указатель на указатель, например:

Tile **tiles;

Что вы также можете сделать, это создать отдельный объект указателя, выделить его, а затемскопируйте данные в элемент массива, используя

stage->tiles[i] = *somePointer;

, а затем удалите указатель, чтобы освободить выделенную память.Это сохранит копию, потому что вы вызвали конструктор копирования.

3 голосов
/ 19 августа 2011

Вы пытаетесь выделить указатель с указателем на массив. Попробуйте это:

class Stage {
    public:
        Tile **tiles;
        void init(int size);
};
1 голос
/ 19 августа 2011
stage->tiles[t] = new Tile();

Вышеприведенный код не является допустимым C ++ кодом, который вы, возможно, путаете с тем, как new используется в других языках, таких как C # . Хотя new можно использовать для выделения динамической памяти, но для назначения объекта определенному элементу в динамически созданном массиве не требуется конструкция new. Фактически, объект уже создан, как только вы вызвали new Tile[size]. Вы можете создать объект типа Tile и назначить его определенному элементу в tiles.

.
Tile myTile;

// do something with myTile

this->tiles[0] = myTile;
0 голосов
/ 19 августа 2011

new Tiles() возвращает указатель на экземпляр Tiles.

Tile *tiles определяет массив из тайлов, а не указателей.

Начинайте с Tile **tiles.

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