c++ 如何从一个类访问另一个已经声明的类?

ar7v8xwq  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(100)

我正在尝试通过制作一个游戏来学习C++ OOP,我有一个Entity类和一个Board类,都包含在main中。我如何在Entity类中编写一个方法来访问Board私有成员,特别是它附近的瓦片?我想编写函数feed(),根据它附近有多少瓦片是空闲的,将energy赋给Entity的一个示例。
Entity.h

class Entity{
    int x;
    int y;
    char type;
    double energy;
public:
    void eat();
... * it has all the constructoros and other stuff but its not relevant
}

Board.h

#include "Entity.h"

class Board{
    Entity matrix[20][70];
public:
    void printBoard();
    Entity getEntity(int i, int j);

... * other functions and contructors. not relevant
}

main.cpp

#include <iostream>
#include "Entity.h"
#include "Board.h"

int main(){
Board* board = new Board();

// here I initialize the board with random entities

}

如何在Entity中编写一个函数来获取附近的平铺并检查它们?我找不到一种方法来与Entity中的其他类交互。它可以带参数。它不一定要精确为void feed();

a5g8bdjr

a5g8bdjr1#

这是设计的问题。你基本上有两个选择:

  1. Board是包含邻域逻辑的对象,
    1.或者Entity知道它的邻居。
    在第一种情况下,您需要有一个从任何实体指向电路板的反向指针:
class Entity; // forward declaration
class Board {
    Entity *matrix;
    Entity *neighborOf(Entity *);
    
};

class Entity {
    Board *theBoard;
    Entity *myNeighbor() { theBoard->neighBorOf(this); }
};

在第二种情况下,构造图元链接到其相邻图元:

class Entity;
class Board {
    Entity *matrix;
    
};
class Entity {
    Entity *neighbor;
    Entity *myNeighbor() { return neighbor; }
};

第一种情况是首选的(IMHO),因为实体可以很容易地在其他板系统中重用。

jgwigjjp

jgwigjjp2#

必须有一个角色(或类)应该可以访问每个实体的位置。对于OOP,我建议添加Entity::isNeighbor(int x,int y)或Entity::isNeighbor(const Entity& other),并让Board进行迭代。

class Entity{
    int x;
    int y;
    char type;
    double energy;
public:
    void eat();

    bool isNeighbor(const Entity& other) const {
        // Yes, different instance in of the same class 
        //   may access each other's private members!
        // Refer to https://stackoverflow.com/q/6921185/4123703
        return (x == other.x) && (y == other.y);
    }
//... 
}

注意这可能会导致整个查找的时间复杂度为O(N^2)。你可能想事先对它们进行排序或者使用一些数据结构,如图或邻接矩阵。将来你可能想学习像最近邻这样的算法。

kb5ga3dv

kb5ga3dv3#

您可以在实体类中引用电路板,并在不同的函数中设置,例如

class Entity{
    int x;
    int y;
    char type;
    double energy;
    shared_ptr<Board> board;
public:
    void setBoard(shared_ptr<Board> board) {
        this->board = board;
    }
    void eat();
... * it has all the constructoros and other stuff but its not relevant
}

相关问题