【问题标题】:Accessing parent classes through composition通过组合访问父类
【发布时间】:2017-11-05 22:25:07
【问题描述】:

在我的程序中,我有一个非常简单的结构来表示 RPG 游戏中的地图。我有一个 Map 类,带有一个由 Area 对象组成的二维数组“网格”,如下所示:

 #pragma once
 #include "Area.h"

 class Map
 {
 public:
     Map();
     ~Map();

     Area Grid[10][10];
 };

然后在 Map 构造函数中:

 Map::Map()
 {
for (int y = 0; y < 10; y++) {
    for (int x = 0; x < 10; x++) {
        Grid[x][y] = Area();
    }
}
}

我希望 Area 对象能够从 Map 对象访问某些值,并且我已经读到我可以在构造 area 对象时包含对 map 类的引用,以便它可以引用回它的父母。但要做到这一点,我必须 Area.h 中的#include "Map.h",这将创建一个包含循环,并且通常不是很好。那么我将如何在每个区域对象中注入对该区域父级的引用呢?感谢您提前提供任何帮助。

【问题讨论】:

  • 这听起来像是一个 XY 问题。你的目标到底是什么?
  • @skypjack 我只希望 Area 对象能够引用它们创建的地图,以便他们可以从中访问某些信息,如果这有任何意义的话。
  • 您可以声明函数或构造函数,这些函数或构造函数采用指向前向声明的类对象的引用或指针。
  • 好的。我将如何在我的示例中实现它?我对 C++ 很陌生。
  • 好的,我发布了代码作为答案,你应该能够将它变成运行程序。

标签: c++ class composition


【解决方案1】:
// Area.h
#pragma once
struct Map;

struct Area {
    Map* map = nullptr;
    Area() {}
    explicit Area( Map* m) : map(m) {}
};

请注意,您可能希望在 Area.cpp(包括 Map.h)中定义 Area 的某些功能。为了简单起见,我只是将其省略了示例代码。

// Map.h
#pragma once
#include "Area.h"

struct Map
{
    Map();
    ~Map();

    Area Grid[10][10];
};

// Map.cpp
#include "Map.h"

Map::Map()
{
    for (int y = 0; y < 10; y++) {
        for (int x = 0; x < 10; x++) {
            Grid[x][y] = Area(this);
        }
    }
}

Map::~Map() {}

// main.cpp
#include "Map.h"
int main()
{
    Map m;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2018-06-18
    • 2020-05-09
    • 2016-08-26
    相关资源
    最近更新 更多