C++ C++;将类型a的变量分配给扩展a的类型B
我正在尝试创建一个tile系统,该系统创建一个tile实例,并将该tile添加到一个tile数组中,从而允许您调用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::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
您希望让平铺构造函数在静态数组中存储自身副本的愿望是不好的。不要在构造函数中做这种事情,而是在构造函数之外做。(产生一个指向这个的共享指针有点烦人:最简单的方法实际上并不奏效