Я пытаюсь создать массив объектов внутри файла заголовка, который не работает (запуск C ++ Programmer) - PullRequest
2 голосов
/ 23 августа 2010

отредактировано ниже для обновлений !!! Спасибо за помощь, пожалуйста, во что бы то ни стало укажите на ВСЕ ошибки, мне все равно, звучит ли это грубо, значит или что-то в этом роде, эмо-хлам. Просто дай мне это прямо, чтобы я мог понять, что происходит не так.

Привет всем!

Я начинающий программист C ++, пытающийся выучить и получить немного опыта IRL для C ++.

Я пытаюсь выполнить следующее в моем компиляторе VC ++ (vs2008):

typedef unsigned short USHORT;

class Grid  
{  
...
public:  
    Grid()  
    {  
        Tile[36]* tileList_ptr;
    }  
...
};

В сущности, я хочу положить 36 плиток, разбить их на множество и аккуратно в куче для игрового поля 8x8, которое никогда не изменится в размере. Как шахматная доска. Обращайтесь к ним с помощью указателя и, при необходимости, возьмите их с собой в связанный cpp-файл.

Если вы сейчас не смеетесь над этой попыткой, то я, вероятно, допустил синтаксическую ошибку вместо существенного недостатка проекта: P

Любая помощь будет высоко ценится!

Заранее спасибо

РЕДАКТИРОВАТЬ 24/08/2010 13:49 (время запуска)

Мой код теперь выглядит следующим образом:

Заголовочный файл сетки Grid.h:

#include "Tile.h"

class Grid
{

//no more typedef used

public: 
    Tile grid[8][8];

private:    
    unsigned short selectedItemIndexValue;
public:
    Grid()
    {

        Initialize();       
    }
    ~Grid(){}

    void Update();
    void FinalizeMove(unsigned short index);
    void Draw();

private:
    void Initialize(); //Initializes members
};

Файл Grid.cpp:

#include "stdafx.h"   
#include "Grid.h"   
//Not tile , that used to give me a class redefinition error

unsigned short selectedItemIndexValue;

//No more typedef used

void Grid::Update()
{
    //Respond to controller commands
}

void Grid::FinalizeMove(unsigned short index)
{

}

void Grid::Draw()
{

}

void Grid::Initialize()
{
    for(int i = 0; i < 4; i++)
    {
        Grid::grid[i] = new Tile::Tile(10,10);   // ATTEMPT AT FILLING ARRAY
    }
}

Файл Tile.h

class Tile
{       
public:

private:
    enum TileOccupation
    {
        EmptyTile = 0,
        WhiteSphere = 1,
        BlackSphere = 2
    };

    unsigned short horizontalDimensions;
    unsigned short verticalDimensions;

public:
    Tile(){}    
    ~Tile(){}

void Update();
void Draw();

};

Файл Tile.cpp:

#include "stdafx.h"
#include "Tile.h"

void Tile::Update()
{

}

void Tile::Draw()
{

}

Попытка заполнения массива в Grid.cpp возвращает через компилятор следующее сообщение об ошибке: «Ошибка 1, ошибка C2061: синтаксическая ошибка: идентификатор '{ctor}'»

MSDN помог мне дать мне это:

"Ошибка компилятора C2061. Компилятор нашел идентификатор там, где он не ожидался. Убедитесь, что идентификатор объявлен, прежде чем его использовать."

Мне не удалось проанализировать его значение. Что именно я здесь сделал неправильно? И какие еще проблемы можно найти в моем проекте? Вся помощь и комментарии будут высоко оценены. Просто предположим, что я знаю 0% C ++

Ответы [ 5 ]

6 голосов
/ 23 августа 2010

@ user428435.Три вещи:

  1. 8x8 - это 64, а не 36
  2. Какие у вас проблемы?Если ошибка компиляции, в чем ошибка?Часто внимательное прочтение ошибок может помочь вам решить ваши проблемы.Если код компилируется и запускается, что он делает, чего вы не ожидаете?
  3. Возможно, вы имели в виду

    Tile * tileList_ptr [36];

2 голосов
/ 23 августа 2010
typedef unsigned short Tile;  // <= assuming typo

class Grid  
{  
...
public:  
    Grid()  
    {
    }  
...
private: 
    Tile tileList[64]; // <= 8x8=64
};

Если количество плиток во время компиляции фиксировано, почему бы не сохранить массив плиток вместо массива указателей на плитки?

2 голосов
/ 23 августа 2010

Если вы хотите выделить память в куче, вы должны использовать оператор выделения, такой как «malloc» или «new». В вашем примере, если написано правильно, увеличится только размер стека конструкторов.

Правильная версияпамяти стека:

Tile tileList_ptr[36];

Правильная версия памяти кучи:

Tile* tileList_ptr = new Tile[36];

Однако, если вы используете «new» или «malloc», вы должны помнить, чтобы использовать «delete»"или" свободен ", когда вам больше не нужна выделенная память ...

1 голос
/ 23 августа 2010

Я смеюсь.Ваш код полон сбоев: P

Первый совет: если вы можете избежать выделения кучи, сделайте.Если ваше игровое поле всегда 8x8, не тратьте время на кучу (другое дело в распределении реального класса игры в куче).

Второй совет: не делайте этого дерьмового typedef без знака короткой USHORT.Это неподписанный короткий.Просто используйте тип напрямую.USHORT не собирается меняться, чтобы не быть неподписанным коротким.Кроме того, имена ALLCAPS зарезервированы для макросов.Вы, вероятно, взяли это из заголовков Windows, они также используют это.На самом деле, это УЖАСНАЯ идея.

В-третьих, 8x8 = 64, а не 36, и вы можете просто прямо сказать 8x8.

То, что вы хотите, выглядит примерно так:

class Grid {
    Tile grid[8][8];
public:
    Grid() {
    }
    Tile* operator[](int index) {
        return grid[index];
    }
    const Tile* operator[](int index) const {
        return grid[index];
    }
    ...
};
0 голосов
/ 23 августа 2010

Возможно, вы имеете в виду это:

Tile tileList_ptr [36];

или это:

Tile * tileList_ptr [36];

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