Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法访问对象指针的2d数组的类成员(类型***)_C++_Arrays_Pointers_Member Functions - Fatal编程技术网

C++ 无法访问对象指针的2d数组的类成员(类型***)

C++ 无法访问对象指针的2d数组的类成员(类型***),c++,arrays,pointers,member-functions,C++,Arrays,Pointers,Member Functions,我正在制作康威的人生游戏。我有两个类,一个用于单元平面,另一个用于单元。这些单元格就像一个二维链表,每个单元格有4个指针指向垂直和水平的相邻单元格。当试图访问任何指向其他单元格的单元格指针或活动成员时,程序崩溃 我的代码 //game.h #ifndef GAME_H_ #define GAME_H_ #include <iostream> class cell{ public: bool alive; cell* top; c

我正在制作康威的人生游戏。我有两个类,一个用于单元平面,另一个用于单元。这些单元格就像一个二维链表,每个单元格有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.h
#ifndef游戏_
#定义游戏_
#包括
类单元{
公众:
布尔活着;
单元格*顶部;
细胞*bot;
单元*lef;
单元*钻机;
单元格(){
活着=假;
顶部=机器人=左侧=钻机=空PTR;
}
单元*链接(字符);
int live_neights();
无效链接右(单元格*);
无效链接(单元格*);
无效刷新单元格();
};
类字段{
公众:
整数大小;
细胞起源;
布尔**新州;
细胞***fi;
字段(INTA);
~field();
};
#恩迪夫

//game.cpp
#包括
#包括“game.h”
int单元格::活动的_邻居(){
int num=0;
(此->顶部);(此->顶部->活动);(++num):(num)|(此->顶部->装备);(此->顶部->装备->活动);(num++):(num)):(num)):(num);
(这个->机器人)?((这个->机器人->活动)?(++num):(num)|(这个->机器人->lef)?((这个->机器人->lef->活动)?(num++):(num)):(num)):(num)):(num);
(这个->装备)?((这个->装备->活动)?(++num):(num)|(这个->装备->机器人)?((这个->装备->机器人->活动)?(num++):(num)):(num)):(num)):(num);
(此->左);(此->左->活动);(++num):(num)|(此->左->机器人);(此->左->机器人->活动);(num++):(num)):(num);
返回num;
}
空单元格::右链接(单元格*linkee){
这个->装备=linkee;
linkee->lef=这个;
}
空单元格::链接向下(单元格*linkee){
此->bot=linkee;
linkee->top=这个;
}
字段::字段(int a){
尺寸=a;
对于(int i=0;ifi[i][j]->link_right(this->fi[i][j+1]);
this->fi[j][i]->link_down(this->fi[j+1][i]);
}
}
原点=fi[0][0]
}
字段::~field(){
对于(int i=size-1;i>=0;i--){
对于(int j=size-1;j>=0;j--){
删除fi[i][j];
}
删除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.h”
int main(){
野战(10);

std::cout alive问题在于
游戏。cpp
尝试此代码

//game.cpp
#include <iostream>
#include "stackoverflow.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];
    }
}
//game.cpp
#包括
#包括“stackoverflow.hpp”
int单元格::活动的_邻居(){
int num=0;
(此->顶部);(此->顶部->活动);(++num):(num)|(此->顶部->装备);(此->顶部->装备->活动);(num++):(num)):(num)):(num);
(这个->机器人)?((这个->机器人->活动)?(++num):(num)|(这个->机器人->lef)?((这个->机器人->lef->活动)?(num++):(num)):(num)):(num)):(num);
(这个->装备)?((这个->装备->活动)?(++num):(num)|(这个->装备->机器人)?((这个->装备->机器人->活动)?(num++):(num)):(num)):(num)):(num);
(此->左);(此->左->活动);(++num):(num)|(此->左->机器人);(此->左->机器人->活动);(num++):(num)):(num);
返回num;
}
空单元格::右链接(单元格*linkee){
这个->装备=linkee;
linkee->lef=这个;
}
空单元格::链接向下(单元格*linkee){
此->bot=linkee;
linkee->top=这个;
}
字段::字段(int a){
尺寸=a;
fi=新单元格**[大小];
对于(int i=0;ifi[i][j]->link_right(this->fi[i][j+1]);
this->fi[j][i]->link_down(this->fi[j+1][i]);
}
}
原点=fi[0][0];
}
字段::~field(){
对于(int i=size-1;i>=0;i--){
对于(int j=size-1;j>=0;j--){
删除fi[i][j];
}
删除fi[i];
}
}
我不明白为什么这里的人会因为问问题而不是用“正确”的方式来编码而生气。我们都需要犯错误并从中学习。在今后的工作中,当你在使用另一个C++项目时,试着使用STL容器,它们将是简单而高效的。你会爱上它们的。
也可以这样考虑n维数组。每个维度使用一个
*
。因此
int*arr
是一个一维数组,
int**arr
是一个二维数组。你可以在这里切换到
单元格**
,因为你想要一个二维数组:)

你可以分配
fi[i]
,但是你在哪里为
fi
本身初始化和分配内存?你真的需要一个指针矩阵吗?那么向量向量呢?似乎更容易将数组中的每个单元格存储为链接单元格的指针。每个单元格中的单元格指针可以直接从中的单元格指针设置字段数组。我回答了,然后用他的答案修复了我的程序。他的最初询问显然是修辞性的,因为我没有在我提供的代码样本中分配
fi
。无论如何,你需要对此无礼吗,在我自己的项目中使用尽可能多的间接寻址有什么问题吗?OP刚才问了一个问题..Ev每个人都会在某个时候把指针式意大利面编码好……还有为什么会有人投反对票?
//game.cpp
#include <iostream>
#include "stackoverflow.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];
    }
}