Search code examples
c++classconways-game-of-lifeundeclared-identifier

Undeclared identifier error where none seems apparent


I am trying to implement a simple version of Conway's Game of Life which consists of a header file and three .cpp files (two for class functions, one for main). Here I have included my header files and two class function declaration files ( the compiler is having no problem with my Main.cpp file).

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

As far as I understand, since I included the header file with the class declarations, then I should be able to access the private members of the class through the previously declared functions in the class.

Essentially the Error Report Looks Like

Error C2065 'item' : undeclared identifier

This error appears for every private member called from the cell class.

What am I doing wrong?


Solution

  • I don't see the word item anywhere in your code. However, you need to fix:

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

    It should be:

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