C++ 将类型 A 的变量分配给扩展 A 的类型 B

标签 c++

<分区>

我正在尝试创建一个图 block 系统,它创建图 block 的单个实例,并将该图 block 添加到图 block 数组中,从而允许您调用 Tile::s_tileList[1] 来得到土 block 。

但是,我遇到了一些问题。这是完整的磁贴代码:

瓷砖.h

#pragma once

class Tile {
public:
    static const Tile s_tileList[128]

    static const Tile s_dirt;

    Tile(int tileId);
    virtual ~Tile();
protected:
private:
    int m_tileId;
};

瓷砖.cpp

#include "tile.h"

#include "tile_dirt.h"

const Tile Tile::s_dirt = TileDirt(1); // This line errors

Tile::Tile(int tileId) {
    s_tileList[tileId] = *this;
    m_tileId = tileId;
}

Tile::~Tile() {

}

tile_dirt.h

#pragma once

#include "tile.h"

class TileDirt : Tile {
public:
    TileDirt(int tileId);
    virtual ~TileDirt();
protected:
private:
};

当我尝试将 s_dirt 分配给 TileDirt 时,出现以下错误:

conversion to inaccessible base class "Tile" is not allowed

我在这里做错了什么?

我试过:

static const Tile* s_dirt;

然后像这样赋值:

const Tile* Tile::s_dirt = new TileDirt(1);

但这只会增加另一个错误:不存在合适的构造函数来将“const Tile *”转换为“Tile”

最佳答案

在 C++ 中,类型为 Foo 的变量表示足以容纳 Foo 的内存块其中的对象(基本上是准确的)。并且正是Foo类型的数据.

如果您尝试在该内存中放入其他内容,您将从 object slicing 中获得任何内容到未定义的行为(这是不好的)。

在许多其他语言(Java、C# 等)中,类型为 Foo 的变量实际上代表 Foo 的句柄其他地方的数据,或者可能是 Foo 的派生类.通常这些是垃圾收集,一个非确定性系统,在运行时引擎确定它们名义上无法从用户代码访问后,您的对象只会在未来某个未知点被销毁。

要在 C++ 中模拟它,您需要一个智能指针 -- std::unique_ptr<Foo>std::shared_ptr<Foo> .这些不是关于垃圾收集智能指针的全部内容,但除非您正在制作自引用数据,否则它们通常就足够了。在 C++ 中,您必须考虑的一件事是“谁拥有此数据的生命周期”。

std::shared_ptr通常是最容易搭配的。

替换你的 Tile带有 std::shared_ptr<Tile> 的实例, 以及您调用 new Tile(blah) 的电话与 std::make_shared<Tile>(blah) .

接下来,class默认情况下,C++ 中的继承是私有(private)的——除了您自己类型的实例之外,没有人可以知道您是父类的子类。如果要公共(public)继承,请使用 public Tile .

您希望拥有您的 Tile构造函数将自身的拷贝存储在静态数组中是不好的。不要在构造函数中做那种事情,让它在构造函数之外完成。 (生成指向 this 的共享指针有点烦人:最简单的方法实际上效果不佳)

关于C++ 将类型 A 的变量分配给扩展 A 的类型 B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785304/

相关文章:

c++ - 多重继承会调用哪个实例?

c++ - 使用 openCV 检测多个对象

c++ - 使用 cmake 交叉编译 gRPC

c++ - 如何重新调用初始化 3D vector 的构造函数

c# - 什么是 C# 等同于 C++ 句柄

c++ - 为什么这个实现的二分搜索比 std::binary_search() 慢得多?

C++ 输入困难

c++ - Armadillo :从稀疏矩阵中获取稀疏行 vector 的非零位置

C++ 虚拟方法,不需要 "this"指针 - 优化

C++ vector 元素计数