(C ++); Динамически определять тип функции (производный класс) - PullRequest
0 голосов
/ 01 мая 2018

Я новичок в C ++, и я застрял в моей программе. Это программа, имитирующая настольную игру «Морской бой». Нам дали код для редактирования, и одна из вещей, которую нас попросили сделать, - заставить программу подсказать вам, для какого типа судна вы хотите сесть (всего 1 корабль в данный момент).

Нам дали для начала определенный класс корабля ( Подводная лодка ), который я превратил в родительский класс Корабль . Я планировал использовать производные классы для каждого из типов кораблей, но функции класса Game имеют параметр исходного класса Submarine (& submarine) (который теперь равен Ship , поэтому параметр - & Ship). Я пытаюсь выяснить, как динамически определить тип параметра, чтобы я мог использовать функцию, для которой когда-либо размещен корабль.

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

Вот пример функции, о которой я говорил ранее (в классе Game ):

 bool placePiece(Ship& piece) // Ship is parent class -- want it to be derived class (1 of 5 options) depending on which class is being used
{
    cout << "What coordinate do you want to place the " << toLower(piece.getName()) << " (length "<<piece.getLength()<<") at?\n";
    string coordinate = toLower(requeststring());
    cout << "What direction do you want the piece to go? (up, down, left or right)\n";
    string direction = toLower(requeststring());

    piece.setPiece(rowCharToInt(getFirstChar(coordinate)), getFirstInt(coordinate)-1, getFirstChar(direction));

    return isValidPlacement(playerBoard, piece);
}

Пожалуйста, дайте мне знать, если потребуется дополнительная информация!

Спасибо

1 Ответ

0 голосов
/ 01 мая 2018

Вам не нужны шаблоны.

Из вашего вопроса я понял следующее

  1. Вам дали класс подводной лодки , вы переименовали его корабль
  2. Вы планируете создать подклассы корабль , например линкор , подводная лодка и т. Д.
  3. В классе Game есть несколько функций, которые принимают ship objects, и вы хотите динамически принимать любой производный класс ship .

Правильно?

Шаблоны нужны только тогда, когда вы хотите, чтобы типы, к которым вы относитесь, не имели никакого отношения. что здесь не так.

Благодаря полиморфизму ваши методы уже смогут обрабатывать то, что вы хотите.

Рассмотрим простой пример, приведенный ниже

#include <iostream>

class Base {
public:
        int a;
};

class Derived : public Base {
public:
        int b;
};

void doge(Base foo) {
        std::cout << "My a value: " << foo.a << std::endl;
}

int main() {
        Derived d;
        d.a = 5;
        doge(d);
        return 0;
}

Обратите внимание, как функция doge принимает и ожидает объект Base , но мы отправляем ему объект Derived . Это работает, потому что это по сути гарантируется полиморфизмом классов.

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

Это также приводит к принципу ООП, называемому принципом замены Лискова . Принцип требует, чтобы вы моделировали объекты базового и производного классов таким образом, чтобы объекты производного класса всегда могли заменить базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...