私は持っている:
Command *command;
if(commandType == "Start")
{
command = new StartCommand();
}
else if (commandType == "Stop")
{
command = new StopCommand();
}
ここで、shared_ptr になりたいcommand
とします。上記のコードを、shared_ptr を使用するように変換するにはどうすればよいでしょうか?
私は持っている:
Command *command;
if(commandType == "Start")
{
command = new StartCommand();
}
else if (commandType == "Stop")
{
command = new StopCommand();
}
ここで、shared_ptr になりたいcommand
とします。上記のコードを、shared_ptr を使用するように変換するにはどうすればよいでしょうか?
変数を適切に初期化したい場合、たとえば の場合は、次のconst
ようにすることができます。
std::shared_ptr<Command> factoryCommand(std::string const& commandType) {
if(commandType == "Start")
return std::make_shared<StartCommand>();
if(commandType == "Stop")
return std::make_shared<StopCommand>();
return std::shared_ptr<Command>(nullptr);
}
std::shared_ptr<Command> const command {factoryCommand(commandType)};
コメントに示されているように、C++ の RAII ガイドラインに違反し、定義と初期化を分離することもできます。ただし、より直感的であり、だまさstd::shared_ptr<Command>::operator=
れて決して.std::shared_ptr<Command>::reset
new
delete
したがって、"Start"
たとえばブランチの場合、これは次のようになります。
std::shared_ptr<Command> command;
//...
// I would flag this in the review process as "you're doing it wrong"
command.reset(new StartCommand());
// This is what you should do if you *have* to separate definition and initialisation:
command = std::make_shared<StartCommand>();
いくつかの非常に単純な変更でうまくいきます。
shared_ptr<Command> command;
if(commandType == "Start")
{
command = make_shared<StartCommand>();
}
else if (commandType == "Stop")
{
command = make_shared<StopCommand>();
}