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

C++ C++;将类型a的变量分配给扩展a的类型B,c++,C++,我正在尝试创建一个tile系统,该系统创建一个tile实例,并将该tile添加到一个tile数组中,从而允许您调用tile::s_tileList[1]来获取污垢tile 然而,我有一些问题。以下是完整的磁贴代码: 瓦片 #pragma once class Tile { public: static const Tile s_tileList[128] static const Tile s_dirt; Tile(int tileId); virtual

我正在尝试创建一个tile系统,该系统创建一个tile实例,并将该tile添加到一个tile数组中,从而允许您调用
tile::s_tileList[1]
来获取污垢tile

然而,我有一些问题。以下是完整的磁贴代码:

瓦片

#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;
};
tile.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() {

}
瓦卢土

#pragma once

#include "tile.h"

class TileDirt : Tile {
public:
    TileDirt(int tileId);
    virtual ~TileDirt();
protected:
private:
};
当我试图将
s\u污垢
分配给
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”
错误与问题的标题不匹配

const Tile Tile::s_dirt = TileDirt(1); // This line errors
您正在声明一个全局常量(不是宏常量,而是内存分配常量,类似于全局变量)

在“main”函数中进行测试,删除全局内容,以及常量内容,首先:

int main(...)
{
  Tile* MyTyle = new TileDirt();
}

然后,如果确实需要,请稍后更改为全局成员和常量成员?

错误与问题的标题不匹配

const Tile Tile::s_dirt = TileDirt(1); // This line errors
您正在声明一个全局常量(不是宏常量,而是内存分配常量,类似于全局变量)

在“main”函数中进行测试,删除全局内容,以及常量内容,首先:

int main(...)
{
  Tile* MyTyle = new TileDirt();
}

然后,如果确实需要,请稍后更改为全局成员和常量成员?

错误与问题的标题不匹配

const Tile Tile::s_dirt = TileDirt(1); // This line errors
您正在声明一个全局常量(不是宏常量,而是内存分配常量,类似于全局变量)

在“main”函数中进行测试,删除全局内容,以及常量内容,首先:

int main(...)
{
  Tile* MyTyle = new TileDirt();
}

然后,如果确实需要,请稍后更改为全局成员和常量成员?

错误与问题的标题不匹配

const Tile Tile::s_dirt = TileDirt(1); // This line errors
您正在声明一个全局常量(不是宏常量,而是内存分配常量,类似于全局变量)

在“main”函数中进行测试,删除全局内容,以及常量内容,首先:

int main(...)
{
  Tile* MyTyle = new TileDirt();
}

<>和,如果确实需要,改变为全局成员,并且在C++中,常量成员

,一个类型的变量<代码> fo代表一个内存块,足以满足它的代码< > Foo< /Cord>对象(基本上是精确的)。它正是
Foo
类型的数据

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

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

在C++中仿真这一点,您需要一个智能指针——<代码> STD::UnQuyGPPT或<代码> STD::SyrdYPPTR < /C>。这些并不是垃圾收集智能指针的全部内容,但除非您正在生成自引用数据,否则它们通常已经足够好了。在C++中你必须考虑的一件事是“谁拥有这个数据的生命周期”。

std::shared_ptr
通常是最容易使用的

std::shared_ptr
替换
Tile
实例,用
std::make_shared(blah)
调用
新Tile(blah)

< C++ >代码>类< /COD> C++中默认继承是私有的——除了您自己类型的实例之外,没有人知道您是父类的子代。如果想要公共继承,请使用
public Tile


您希望让
平铺
构造函数在静态数组中存储自身副本的愿望是不好的。不要在构造函数中做这种事情,而是在构造函数之外做。(生成一个共享指针有点恼人:最简单的方法实际上并不好)

< P> C++中,一个类型的变量<代码> Foo代表一个内存块,足以满足它的代码< Foo> /Cord>对象(基本上是精确的)。它正是
Foo
类型的数据

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

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

在C++中仿真这一点,您需要一个智能指针——<代码> STD::UnQuyGPPT或<代码> STD::SyrdYPPTR < /C>。这些并不是垃圾收集智能指针的全部内容,但除非您正在生成自引用数据,否则它们通常已经足够好了。在C++中你必须考虑的一件事是“谁拥有这个数据的生命周期”。

std::shared_ptr
通常是最容易使用的

std::shared_ptr
替换
Tile
实例,用
std::make_shared(blah)
调用
新Tile(blah)

< C++ >代码>类< /COD> C++中默认继承是私有的——除了您自己类型的实例之外,没有人知道您是父类的子代。如果想要公共继承,请使用
public Tile

您希望让
平铺
构造函数在静态数组中存储自身副本的愿望是不好的。不要在构造函数中做这种事情,而是在构造函数之外做。(产生一个指向这个的共享指针有点烦人:最简单的方法实际上并不奏效