2015-09-24 6 views
3

Я пытаюсь реализовать простую версию Game of Life от Conway, которая состоит из файла заголовка и трех файлов .cpp (два для функций класса, один для основного). Здесь я включил файлы заголовков и два файла объявления функции класса (у компилятора нет проблем с моим файлом Main.cpp).Ошибка идентификатора ошибки, в которой нет видимых данных

Game_Of_Life.h

#include <iostream> 
#include <cstdlib> 
#include <time.h> 

using namespace std; 

class cell{ 
    public: 
     cell(); 
     int Current_State();      // Returns state (1 or 0) 
     void Count_Neighbours(cell* A);    // Counts the number of living cells in proximity w/o wraparound 
     void Set_Future();       // Determines the future value of state from # of neighbbours 
     void Update();        // Sets state to value of future state 
     void Set_Pos(unsigned int x, unsigned int y); // Sets position of cell in the array for use in counting neighbours 
    private: 
     int state; 
     int neighbours; 
     int future_state; 
     int pos_x; 
     int pos_y; 
}; 

class cell_array{ 
    public: 
     cell_array();         
     void Print_Array();        // Prints out the array 
     void Update_Array();       // Updates the entire array 
     void Set_Future_Array();      // Sets the value of the future array 
    private: 
     cell** A; 
}; 

Cell_Class_Functions.cpp

#include "Game_Of_Life.h" 

cell::cell(){ 
    state = rand() % 2; 
    return; 
} 

void cell::Set_Future(){ 
    if (state == 1){ 
     if (neighbours < 2) future_state = 0; 
     else if (neighbours == 2 || neighbours == 3) future_state = 1; 
     else if (neighbours > 3) future_state = 0; 
    } 
    else{ 
     if (neighbours == 3) future_state = 1; 
    } 
    return; 
} 

void cell::Update(){ 
    state = future_state; 
    return; 
} 

int cell::Current_State(){ 
    return state; 
} 

void cell::Set_Pos (unsigned int x, unsigned int y){ 
    pos_x = x; 
    pos_y = y; 
    return; 
} 

void Count_Neighbours (cell* A){ 
    neighbours = 0; 
    if (pos_x > 0) neighbours += A[pos_y * 10 + pos_x - 1].Current_State(); 
    if (pos_x < 9) neighbours += A[pos_y * 10 + pos_x + 1].Current_State(); 
    if (pos_y > 0) neighbours += A[(pos_y - 1) * 10 + pos_x].Current_State(); 
    if (pos_y < 9) neighbours += A[(pos_y + 1) * 10 + pos_x].Current_State(); 
    if (pos_x > 0 && pos_y > 0) neighbours += A[(pos_y - 1) * 10 + pos_x - 1].Current_State(); 
    if (pos_x > 0 && pos_y < 9) neighbours += A[(pos_y + 1) * 10 + pos_x - 1].Current_State(); 
    if (pos_x < 9 && pos_y > 0) neighbours += A[(pos_y - 1) * 10 + pos_x + 1].Current_State(); 
    if (pos_x < 9 && pos_y < 9) neighbours += A[(pos_y + 1) * 10 + pos_x + 1].Current_State(); 
    return; 
} 

Cell_Array_Class_Functions.cpp

#include "Game_Of_Life.h" 

cell_array::cell_array(){ 
    A = (cell**) malloc (sizeof(cell*)*100); 
    for (unsigned int r = 0; r < 10; r++){ 
     for (unsigned int c = 0; c < 10; c++){ 
      *A[r * 10 + c].Set_Pos(r,c); 
     } 
    } 
    return; 
} 

void cell_array::Update_Array(){ 
    for (unsigned int r = 0; r < 10; r++){ 
     for (unsigned int c = 0; c < 10; c++){ 
      *A[r * 10 + c].Update(); 
     } 
    } 
} 

void cell_array::Set_Future_Array(){ 
    for (unsigned int r = 0; r < 10; r++){ 
     for (unsigned int c = 0; c < 10; c++){ 
      *A[r * 10 + c].Count_Neighbours(A); 
      *A[r * 10 + c].Set_Future(); 
     } 
    } 
    return; 
} 

void cell_array::Print_Array(){ 
    cout << "\n"; 
    for (unsigned int r = 0; r < 10; r++){ 
     for (unsigned int c = 0; c < 10; c++)cout << *A[r * 10 + c].Current_State() << " "; 
     cout << "\n"; 
    } 
    return; 
} 

Насколько я понимаю, поскольку я включил заголовочный файл с объявлениями класса, я должен иметь доступ к закрытым членам класса через ранее объявленные функции в классе.

По существу Сообщить об ошибке выглядит

Error C2065 'item' : undeclared identifier 

Эта ошибка появляется для каждого частного члена вызывается из клеток класса.

Что я делаю неправильно?

+2

«По сути, отчет об ошибке выглядит по существу». По существу, проблема заключается в вашем коде. Является ли это достаточно хорошим ответом? Вы, безусловно, чувствуете, что ваш вопрос достаточно хорош. 'Help Plz?' Если вам действительно нужна помощь, вы бы указали точное сообщение об ошибке и строку кода, на которую он указывает. Но у вас нет, что говорит мне, что вы действительно не хотите помощи. –

+0

Ваше использование 'malloc' неверно. Malloc может использоваться только для POD. Вместо этого используйте 'vector'. –

+0

@ M.M, но указатель (или его массив) * - это POD. Не делает следующий код менее UB-побуждением;) – Quentin

ответ

1

Я не вижу слова item в любом месте вашего кода. Тем не менее, вам нужно исправить:

void Count_Neighbours (cell* A){ ... } 

Оно должно быть:

void cell::Count_Neighbours (cell* A){ ... } 
2

Кроме того, в вашем Cell_Array_Class_Functions.cpp вам нужно настроить свои функции.

Оператор . используется на объектах и ​​ссылках. Вы должны сначала почтить его, чтобы получить ссылку. То есть:

(*A[r * 10 + c]).Set_Pos(r,c);

В качестве альтернативы, вы можете использовать (это является предпочтительным и более удобным для чтения способом):

A[r * 10 + c]->Set_Pos(r,c);

Два эквивалентны.

+2

Второй, безусловно, лучший, более идиоматический C++. Первая запись становится очень неуклюжей, если вы достаточно злоупотребляете Законом Деметры, чтобы иметь 'name1-> ptr2-> ptr3.member4-> member5 [index]'; это намного более читаемо, чем '(* (* (* name1) .ptr2) .ptr3.member4) .member5 [index] '(хотя это не очень приятно даже с оператором стрелки). –