如何到达2D对象动态数组的字段?

时间:2016-10-23 22:16:58

标签: c++ arrays

我想创建康威的生命游戏。我有两个类Cell和Board,在板上我想创建2D动态数组类型Cell。我不知道如何让这个数组进入Cell的领域。编译器显示

  

C:\ Users \ Ja \ Desktop \ ObjectProject \ ObjectGameOfLife \ board.cpp:54:错误:C2248:' Cell :: state_current':无法访问类' Cell&中声明的私有成员#39;

抱歉我的英文。

#ifndef CELL_H
#define CELL_H

#include <iostream>
#include <cstdlib>

using namespace std;

class Cell
{
  bool state_current;
  bool state_future;
  int neighbors;

  void editCell(bool n_state);

public:
  Cell();
  void show();
  void edit();
};

cell.cpp

#endif // CELL_H
#include "cell.h"

Cell::Cell()
{
  int a=0;

  a=rand()%2;
  if(a==1)
    state_current=true;
  else
    state_current=false;

  state_future=false;
  neighbors=0;
}

void Cell::show()
{
  if(state_current==true)
    cout<<'X';
  else
    cout<<'O';
}

void Cell::editCell(bool n_state)
{
  state_current=n_state;
}

void Cell::edit()
{
  int option;

  cout<<"choose avaible option:\n0.dead\n1.alive"<<endl;

  cin>>option;
  while(option!=1 && option!=0)
  {
     cout<<"choose avaible option"<<endl;
     cin>>option;
 }

  if(option==1)
    editCell(true);
  else
    editCell(false);
 }

board.h

#ifndef BOARD_H
#define BOARD_H

#include "cell.h"

class Board
{
    int v;
    int c;
    Cell **t;
public:
    Board(int a=10, int b=10); //konstruktor z wartościami domyślnymi
    void showBoard();
    void getSize();
    void createBoard();
    void checkNeighborhood(int x, int y);
    void rules(int x, int y);
    void nextGen();
};

#endif // BOARD_H

board.cpp

#include "board.h"

Board::Board(int a,int b)
{   
    v=a;
    c=b;
    t=new Cell *[v];

    for(int i=0; i<v; i++)
        t[i]=new Cell [c];
}

void Board::createBoard()
{
    t=new Cell *[v];

    for(int i=0; i<v; i++)
        t[i]=new Cell [c];
}

void Board::showBoard()
{
    for(int i=0; i<v; i++)
    {
        for(int j=0; j<c; j++)
            t[i][j].show();
        cout<<endl;
    }
}

void Board::getSize()
{
    int a,b;

    cout<<"Enter natural numbers"<<endl;
    cin>>a;
    cin>>b;
    while(a<1 && b<1)
    {
        cout<<"Board can't have this size. Enter natural numbers"<<endl;
        cin>>a;
        cin>>b;
    }
    v=a;
    c=b;
}

void Board::checkNeighborhood(int x, int y)
{
    for(int i=x-1; i<x+2; i++)
        for(int j=y-1; j<y+2; j++)
            if(i>=0 && i<v && j>=0 && j<c)
                if(!(i==x && j==y))
                    if(t[i][j].state_current==true)//first crash
                        t[i][j].neighbors++;
}

void Board::rules(int x, int y)
{

    if(t[x][y].state_current==true)
        if(t[x][y].neighbors<2 || t[x][y].neighbors)
            t[x][y].state_future=false;
        else
            t[x][y].state_future=true;
    else
        if(t[x][y].neighbors==3)
            t[x][y].state_future=true;
        else
            t[x][y].state_future=false;
}

void Board::nextGen()
{
    for(int i=0; i<v; i++)
        for(int j=0; j<c; j++)
        {
            rules(i,j);
            t[i][j].state_current=t[i][j].state_future;
        }
}

1 个答案:

答案 0 :(得分:0)

问题正是它所说的那样;您正在尝试从另一个对象修改私有属性。在这一行:

     if(t[i][j].state_current==true)//first crash

请注意,您直接进入对象并尝试抓住属性(成员变量),而不是询问Cell状态是什么。

封装功能并将其设置为私有的部分目的是防止其他对象进入内部并且无情地修改内容。即使您只是在这里执行检查,正确的方法是使用对象方法来查询对象。将这样的内容添加到Cell.h和Cell.cpp作为Public函数:

boolean Cell::status()
{
  return state_current;
}

然后这样称呼它:

if(t[i][j].status()==true)

显然,您应该采用相同的面向对象的方法来处理您对单元格所做的其余操作。不要试图直接修改单元格,告诉对象应该如何修改它,然后让单元格管理它。这使您的代码可以重用并且更具可读性。