0

私は持っている:

Command *command;

if(commandType == "Start")
{
  command = new StartCommand();
}
else if (commandType == "Stop")
{
  command = new StopCommand();
}

ここで、shared_ptr になりたいcommandとします。上記のコードを、shared_ptr を使用するように変換するにはどうすればよいでしょうか?

4

2 に答える 2

4

変数を適切に初期化したい場合、たとえば の場合は、次の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>::resetnewdelete

したがって、"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>();
于 2012-04-19T21:38:00.433 に答える
0

いくつかの非常に単純な変更でうまくいきます。

shared_ptr<Command> command;

if(commandType == "Start")
{
  command = make_shared<StartCommand>();
}
else if (commandType == "Stop")
{
  command = make_shared<StopCommand>();
}
于 2012-04-20T05:11:24.280 に答える