无法访问二维对象指针数组的 class 成员(类型***)

Cannot access class member of a 2d array of object pointers (type***)

我正在制作康威的人生游戏。我有两个 类,一个用于细胞平面,另一个用于细胞。这些单元格就像一个二维链表,每个单元格有 4 个指针指向垂直和水平的邻居。当尝试访问任何指向其他单元格或活动成员的单元格指针时,程序崩溃。

我的代码

//game.h
#ifndef GAME_H_
#define GAME_H_
#include <iostream>
class cell{
    public:
        bool alive;
        cell* top;
        cell* bot;
        cell* lef;
        cell* rig;
        cell(){
            alive = false;
            top = bot = lef = rig = nullptr;
        }
        cell* link(char);
        int alive_neighbors();
        void link_right(cell*);
        void link_down(cell*);
        void refresh_cell();

};

class field{
    public:
        int size;
        cell * origin;
        bool ** new_state;
        cell *** fi;
        field(int a);
        ~field();

};

#endif

//game.cpp
#include <iostream>
#include "game.h"

int cell::alive_neighbors(){
    int num = 0;
    (this->top)?((this->top->alive)?(++num):(num)||((this->top->rig)?((this->top->rig->alive)?(num++):(num)):(num))):(num);
    (this->bot)?((this->bot->alive)?(++num):(num)||((this->bot->lef)?((this->bot->lef->alive)?(num++):(num)):(num))):(num);
    (this->rig)?((this->rig->alive)?(++num):(num)||((this->rig->bot)?((this->rig->bot->alive)?(num++):(num)):(num))):(num);
    (this->lef)?((this->lef->alive)?(++num):(num)||((this->lef->bot)?((this->lef->bot->alive)?(num++):(num)):(num))):(num);
    return num;
}

void cell::link_right(cell* linkee){
    this->rig = linkee;
    linkee->lef = this;
}

void cell::link_down(cell* linkee){
    this->bot = linkee;
    linkee->top = this;
}

field::field(int a){
    size = a;
    for (int i= 0; i < size; i++){
        fi[i] = new cell*[size];
        for (int j = 0; j < size; j++){
            fi[i][j] = new cell;                
        }
    }
    for (int i = 0; i < size; i++){
        for (int j = 0; j < size -1; j++){
            this->fi[i][j]->link_right(this->fi[i][j+1]);
            this->fi[j][i]->link_down(this->fi[j+1][i]);
        }
    }
    origin = fi[0][0]
}

field::~field(){
    for (int i = size -1; i >= 0; i--){
        for (int j = size -1;j >= 0; j--){
            delete fi[i][j];
        }
        delete fi[i];
    }
}

错误:

#include "game.h"
int main(){
    field game(10);
    std::cout << game.origin->alive << std::endl; //compiles but crashes :(
    std::cout << game.origin->rig << std::endl; //also compiles and crashes without giving adress.
    std::cout << game.fi[0][0]->alive; //even directly accessing the cell compiles and crashes.
}

问题出在 game.cpp 试试这个代码

//game.cpp
#include <iostream>
#include "Whosebug.hpp"

int cell::alive_neighbors(){
    int num = 0;
    (this->top)?((this->top->alive)?(++num):(num)||((this->top->rig)?((this->top->rig->alive)?(num++):(num)):(num))):(num);
    (this->bot)?((this->bot->alive)?(++num):(num)||((this->bot->lef)?((this->bot->lef->alive)?(num++):(num)):(num))):(num);
    (this->rig)?((this->rig->alive)?(++num):(num)||((this->rig->bot)?((this->rig->bot->alive)?(num++):(num)):(num))):(num);
    (this->lef)?((this->lef->alive)?(++num):(num)||((this->lef->bot)?((this->lef->bot->alive)?(num++):(num)):(num))):(num);
    return num;
}

void cell::link_right(cell* linkee){
    this->rig = linkee;
    linkee->lef = this;
}

void cell::link_down(cell* linkee){
    this->bot = linkee;
    linkee->top = this;
}

field::field(int a){
    size = a;
    fi = new cell**[size];
    for (int i= 0; i < size; i++){
        fi[i] = new cell*[size];
        for (int j = 0; j < size; j++){
            fi[i][j] = new cell;                
        }
    }
    for (int i = 0; i < size; i++){
        for (int j = 0; j < size -1; j++){
            this->fi[i][j]->link_right(this->fi[i][j+1]);
            this->fi[j][i]->link_down(this->fi[j+1][i]);
        }
    }
    origin = fi[0][0];
}

field::~field(){
    for (int i = size -1; i >= 0; i--){
        for (int j = size -1;j >= 0; j--){
            delete fi[i][j];
        }
        delete fi[i];
    }
}

我不明白为什么这里的人会生气,因为提问的人不是用 "correct" 风格编码的。我们都需要犯错误并从中吸取教训。将来当您处理另一个 C++ 项目时,请注意这一点。尝试使用 STL 容器,它们将非常简单和高效。你会爱上它们的。

n维数组也这么想。每个维度使用一个 *。所以 int* arr 是一维数组,而 int** arr 是二维数组。你可以在这里切换到 cell** 因为你想要一个二维数组 :)