将对象初始化为子类C 的实例
Initialize an object as an instance of a subclass C++
我不确定如何言语我要寻找什么,这可能就是为什么我无法通过搜索找到答案的原因。基本上,我有一个将另一个对象作为成员的类,我想将该成员作为该成员类型的子类初始化。封装类称为游戏,成员变量是clasStype gamestate,我想将其初始化为Mainmenugamestate的新实例,该实例扩展了Gamestate。
class MainMenuGameState : public GameState {
public:
MainMenuGameState();
};
class GameState {}; //Will be abstract class, not to be instantiated
class Game {
private:
GameState gameState; //Would want this to be initialized as a MainMenuGameState, not just a GameState;
public:
Game();
}
我可以想到如何在Java中执行此操作,而不是在C 中。谢谢!
Java和C 之间许多基本语言差异之一是所有Java对象都是通过共享指针隐式引用的。
c 为您提供了表达对象是否应通过指针范围或对象范围来管理对象的选择(以及负担)。
为了容纳任何多态对象,您必须通过某种指针来持有它(正如其他答案所述,最好使用unique_ptr或shared_ptr,具体取决于对象的寿命是由一个所有者还是由一个所有者管理)。
完整示例(已修复了警告):
#include <memory>
class GameState {
public:
virtual ~GameState() = default;
}; //Will be abstract class, not to be instantiated
class MainMenuGameState
: public GameState
{
public:
MainMenuGameState() {}
};
class Game {
private:
std::unique_ptr<GameState> gameState; //Would want this to be initialized as a MainMenuGameState, not just a GameState;
public:
Game();
};
Game::Game()
: gameState { new MainMenuGameState }
{}
using namespace std;
int main()
{
Game g;
return 0;
}
使用指针,最好是std::unique_ptr
:
#include <memory>
class Game {
private:
std::unique_ptr<GameState> gameState;
public:
Game()
: gameState(std::unique<MainMenuGameState>(new MainMenuGameState())) { }
};
使用指针指向基类: GameState* pGameState
。然后在您的构造函数中:
MainMenuGameState::MainMenuGameState() :
pGameState(new MainMenuGameState())
{
}
MainMenuGameState::~MainMenuGameState()
{
delete pGameState;
}
,您应该添加一个虚拟破坏者到游戏中,以便它可以正确清理任何资源:
class GameState {
public:
virtual ~GameState() {}
}
相关文章:
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 无法将模板子类强制转换为其他模板实例化
- 创建子类的多个实例,其中只有一个超类实例
- 是具有接口专用化的子类多态的模板实例化
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 返回具体子类实例的 C++ 虚拟类函数
- 是否可以为所有子类设置一个实例?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 从C++中的父类实例访问子类方法
- 如何使用 QList 跟踪子类的实例
- 如何有条件地实例化不同的父/子类
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
- 创建 QQuickItem 子类的实例是否有问题,我不打算渲染或添加到 QML 树中的实例?
- 如何在尝试为某些非类型值实例化模板子类方法时产生编译器错误
- 将对象初始化为子类C 的实例
- 通过构造函数param实例化子类
- 如何从另一个类访问一个类的方法/变量,而不在c++中实例化它或子类
- 重载的子类函数,将子类的实例作为参数,如何使用
- 如何将类的实例更改为子类的实例
- 将子类实例替换为超类引用 c++