C++ 将对象初始化为子类C++;
我不知道如何说出我在寻找什么,这可能就是我无法通过搜索找到答案的原因。基本上,我有一个类,其中有另一个对象作为成员,我想将该成员初始化为一个实例,该实例是该成员类型的子类。封装类称为Game,成员变量为classtype GameState,我想将其初始化为MainMenuGameState的新实例,它扩展了GameStateC++ 将对象初始化为子类C++;,c++,C++,我不知道如何说出我在寻找什么,这可能就是我无法通过搜索找到答案的原因。基本上,我有一个类,其中有另一个对象作为成员,我想将该成员初始化为一个实例,该实例是该成员类型的子类。封装类称为Game,成员变量为classtype GameState,我想将其初始化为MainMenuGameState的新实例,它扩展了GameState class MainMenuGameState : public GameState { public: MainMenuGameState();
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++中没有。谢谢 使用指向基类的指针:
GameState*pGameState
。
然后在构造函数中:
MainMenuGameState::MainMenuGameState() :
pGameState(new MainMenuGameState())
{
}
MainMenuGameState::~MainMenuGameState()
{
delete pGameState;
}
您应该在GameState中添加虚拟析构函数,以便它能够正确清理任何资源:
class GameState {
public:
virtual ~GameState() {}
}
使用指向基类的指针:
GameState*pGameState
。
然后在构造函数中:
MainMenuGameState::MainMenuGameState() :
pGameState(new MainMenuGameState())
{
}
MainMenuGameState::~MainMenuGameState()
{
delete pGameState;
}
您应该在GameState中添加虚拟析构函数,以便它能够正确清理任何资源:
class GameState {
public:
virtual ~GameState() {}
}
使用指针,最好是
std::unique\u ptr
:
#include <memory>
class Game {
private:
std::unique_ptr<GameState> gameState;
public:
Game()
: gameState(std::unique<MainMenuGameState>(new MainMenuGameState())) { }
};
#包括
班级游戏{
私人:
std::唯一的游戏状态;
公众:
游戏()
:gameState(std::unique(newmainmenugamestate()){}
};
使用指针,最好是std::unique\u ptr
:
#include <memory>
class Game {
private:
std::unique_ptr<GameState> gameState;
public:
Game()
: gameState(std::unique<MainMenuGameState>(new MainMenuGameState())) { }
};
#包括
班级游戏{
私人:
std::唯一的游戏状态;
公众:
游戏()
:gameState(std::unique(newmainmenugamestate()){}
};
> p> java和C++之间的许多基本语言差异之一是所有的java对象都通过共享指针隐式引用。
C++为您提供了一个选择(因此也是一个负担),即表示对象应该由指向它们的指针的范围管理,还是由对象本身的范围管理
为了保存任何多态对象,您必须通过某种指针方式保存它(正如其他答案所提到的,最好使用unique_ptr或shared_ptr,这取决于对象的生存期是由一个所有者还是由多个所有者管理)
完整示例(已修复警告):
#包括
类配子态{
公众:
virtual~GameState()=默认值;
}; //将是抽象类,而不是实例化
类MainMenuGameState
:公共游戏状态
{
公众:
MainMenuGameState(){}
};
班级游戏{
私人:
std::unique_ptr gameState;//希望将其初始化为MainMenuGameState,而不仅仅是gameState;
公众:
游戏();
};
Game::Game()
:配子状态{new MainMenuGameState}
{}
使用名称空间std;
int main()
{
游戏g;
返回0;
}
> p> java和C++之间的许多基本语言差异之一是所有的java对象都通过共享指针隐式引用。
C++为您提供了一个选择(因此也是一个负担),即表示对象应该由指向它们的指针的范围管理,还是由对象本身的范围管理
为了保存任何多态对象,您必须通过某种指针方式保存它(正如其他答案所提到的,最好使用unique_ptr或shared_ptr,这取决于对象的生存期是由一个所有者还是由多个所有者管理)
完整示例(已修复警告):
#包括
类配子态{
公众:
virtual~GameState()=默认值;
}; //将是抽象类,而不是实例化
类MainMenuGameState
:公共游戏状态
{
公众:
MainMenuGameState(){}
};
班级游戏{
私人:
std::unique_ptr gameState;//希望将其初始化为MainMenuGameState,而不仅仅是gameState;
公众:
游戏();
};
Game::Game()
:配子状态{new MainMenuGameState}
{}
使用名称空间std;
int main()
{
游戏g;
返回0;
}
可能还需要注意的是,由于OP似乎没有这样做,所以游戏状态必须有一个虚拟析构函数。否则,当对象被破坏时,这将表现出未定义的行为。可能还需要注意的是,由于OP似乎没有这样做,该游戏状态必须有一个虚拟的析构函数。否则,当对象被破坏时,这将显示未定义的行为。最好添加析构函数以避免泄漏。最好添加析构函数以避免泄漏。