Передача через подкласс в качестве параметра, используя этот - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь отправить класс в качестве параметра конструктору, используя this, и я делаю это в двух разных классах CasinoDealer и Gambler, поэтому на стороне получателя StandAction У меня есть конструктор, который принимает 2 аргумента performer и hand.

Performer - это класс, но в качестве базового класса у меня есть аргумент, который CasinoDealer и Gambler оба наследуют; Player базовый класс.

Я думал, что поскольку класс Gambler или класс CasinoDealer наследуют базовый класс Player, я мог бы отправить класс, используя this, а принимающая сторона должна иметь в качестве аргумента Player* performer и знать какой класс, который создал объект, но, видимо, это не работает, так как мне это сделать?

Я пропустил некоторые включения и неважные функции, подобные этой, чтобы минимизировать количество отправленного кода.

Gambler.cpp

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

Player.h

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

StandAction.h

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

StandAction.cpp

StandAction::StandAction(Player* performer, Hand hand) : Action(performer, hand) {

}

Жалуется, что ни один экземпляр конструктора не соответствует списку аргументов. Я подумал, что если класс, который я отправил, унаследован Player, было бы хорошо передать его в качестве аргумента и иметь Player* performer на стороне получателя.

C++ no instance of constructor matches the argument list
            argument types are: (Gambler *, Hand *)

1 Ответ

2 голосов
/ 26 июня 2019

Ну, ошибка мне вполне понятна.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()виртуальная.

...