【问题标题】:Cannot access class member of a 2d array of object pointers (type***)无法访问二维对象指针数组的类成员(类型***)
【发布时间】:2015-08-25 02:28:31
【问题描述】:

我正在制作康威的人生游戏。我有两个类,一个用于细胞平面,另一个用于细胞。这些单元格就像一个二维链表,每个单元格有 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.
}

【问题讨论】:

  • 您分配了fi[i],但是您在哪里为fi 本身初始化和分配内存?你真的需要一个指针矩阵吗?那么向量的向量呢?
  • 将数组中的每个单元格存储为用于链接单元格的指针似乎更容易。每个单元格中的单元格指针可以直接从字段数组中的单元格指针设置。
  • 我回复了,然后用他的答案修复了我的程序。他最初的询问显然是修辞,因为我没有在我提供的代码示例中的任何地方分配fi。无论如何,您需要对此无礼吗,在我自己的项目中使用尽可能多的间接性有什么问题?
  • OP 刚刚问了一个问题.. 每个人都曾编写过指针意大利面条... 还有为什么大家对这个问题投反对票?

标签: c++ arrays pointers member-functions


【解决方案1】:

问题出在game.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];
    }
}

我不明白为什么这里的人会因为提出问题的人没有以“正确”的风格进行编码而感到恼火。我们都需要犯错误并从中吸取教训。将来当您处理另一个 C++ 项目时,请注意这一点。尝试使用 STL 容器,它们将非常简单和高效。你会爱上他们的。

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

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多