使用子类作为参数传递

时间:2019-06-26 19:32:58

标签: c++ visual-c++ arguments parameter-passing

我正在尝试使用this将类作为参数发送给构造函数,并且在两个不同的类CasinoDealerGambler中这样做,所以在接收器端StandAction我有一个构造函数,它接受2个参数performerhand

Performer是类,但是我有一个自变量CasinoDealerGambler都继承的基类。 Player基类。

我认为,由于Gambler类或CasinoDealer类继承了Player基类,因此我可以使用this发送该类,并且接收端具有{ {1}}作为参数,并知道哪个类创建了对象,但是显然这是行不通的,那么我该怎么做?

我省略了一些包含和不重要的功能,以最大程度地减少发布的代码。

Gambler.cpp

Player* performer

Player.h

Action* Gambler::GetAction(int input) {
    Action* action = nullptr;
    switch (input) {
    case 1:
        action = new StandAction(this, new Hand());
        break;
    default:
        break;
    }
    return action;
}

StandAction.h

class Player {
public:
    virtual Action* DecideNextMove() = 0;
};

StandAction.cpp

class StandAction : public Action {
public:
    StandAction(Player* performer, Hand hand);
    void Execute();
};

它抱怨没有构造函数的实例匹配参数列表。我认为,如果我发送的类继承了StandAction::StandAction(Player* performer, Hand hand) : Action(performer, hand) { } ,可以将其作为参数传递,并且在接收者端使用Player

Player* performer

1 个答案:

答案 0 :(得分:2)

嗯,这个错误对我来说很清楚。 new Hand()返回Hand*,而不是Hand构造函数所需的StandAction。因此,您可能想要new StandAction(this,Hand());

请不要使用new,请使用std::unique_ptr<T>并按值返回std::unique_ptr<Action>。除非您知道自己在做什么,否则最好只对未拥有的关系使用原始指针。

编辑:使用unique_ptr

std::unique_ptr<Action> Gambler::GetAction(int input) {
    std::unique_ptr<Action> action;
    switch (input) {
    case 1:
        action = std::make_unique<StandAction>(this, Hand());
        break;
    default:
        break;
    }
    return action;
}

由于在两种情况下都将StandAction*投射到Action*,因此请确保Action::~Action()是虚拟的。