在c++中从unique_ptr向量返回单个对象

8ehkhllq  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在做一个命令应用程序,我有其他命令类继承的基类。

struct BaseCommand {
public:
    virtual ~BaseCommand() {}
    int id = 0;
    std::string name = "Base Command";
    std::string description = "Base Command";
    BaseCommand();
    virtual std::string getName();
    virtual int getId();
    virtual std::string getDescription();
private:
    virtual void init();
    virtual void run();
    
};
class HelpCommand: public BaseCommand {
public:
    HelpCommand();
    std::string name = "help";
    std::string description = "output help";
    int id = 1;
    virtual std::string getName();
    int getId() {return this->id;}; 
    virtual std::string getDescription();
    
private:
    virtual void init();
    virtual void run();
};
class ProductCommand: public BaseCommand {
public:
    ProductCommand();
    std::string name = "prod";
    std::string description = "product";
    int id = 2;
    virtual std::string getName();
    int getId() {return this->id;};
    virtual std::string getDescription();
    
private:
    virtual void init();
    virtual void run();
};

在我的main中,我把我的子类推到一个vector中,我的目标是通过它的名字得到这个命令,我怎么做呢,得到唯一的命令并把它赋给一个变量

std::vector<std::unique_ptr<BaseCommand>> commands;
    // lett's push our commands...
    commands.emplace_back(new HelpCommand);
    commands.emplace_back(new ProductCommand);
    std::string command = 'prod';

    // what's the type should be for selectedCommand?
    ?? selectedCommand;

    for (int i = 0; i < commands.size(); ++i) {
        if (commands[i]->getName() == command) {
             selectedCommand = commands[i];
        }
   }

我似乎不能确定selectedCommand应该是哪种类型。请告诉我我错过了什么?
我似乎不能确定selectedCommand应该是哪种类型。请告诉我我错过了什么?

eit6fx6z

eit6fx6z1#

不能“覆盖”成员变量。
你的派生类有两个相同名称的成员变量;一个在基类中,一个在派生类中。
当您通过指向BaseCommand的指针访问对象时,将从BaseCommand而不是从派生类获取成员。
重新设计,使这些访问器仅为基的成员,并使访问器成为非虚拟的:

struct BaseCommand {
public:
    virtual ~BaseCommand() {}
    const std::string& getName() const { return name; }
    int getId() const { return id; }
    const std::string& getDescription() const { return description; }

protected:
    // Let only derived classes create base instances.
    BaseCommand(int id,
                const std::string& name,
                const std::string& description)
        : id(id), name(name), description(description)
    {}

private:
    int id = 0;
    std::string name = "Base Command";
    std::string description = "Base Command";

    virtual void init();
    virtual void run();
};

class HelpCommand: public BaseCommand {
public:
    HelpCommand() : BaseCommand(1, "help", "output help") {}
private:
    virtual void init();
    virtual void run();
};
class ProductCommand: public BaseCommand {
public:
    ProductCommand() : BaseCommand(2, "prod", "product") {}
private:
    virtual void init();
    virtual void run();
};

相关问题