У меня есть абстрактный класс «Базовый» и производные классы, такие как шестнадцатеричный, двоичный и так далее ... Пользователь вводит строку, сообщающую мне, какую базу он сейчас использует, и вводит номер. Мне нужно использовать полиморфизм (вместо управляющих операторов, таких как if, switch и т. Д.), Чтобы создать необходимый объект или, по крайней мере, изменить это число на десятичное, чтобы я мог выполнять вычисления, необходимые с разными числами в разных базах, которые я получаю от пользователя. Я много пробовал, но не могу понять, как это сделать. Моя текущая идея - динамически вызывать функцию "double toDec (const Base &)", но не думаю, что это правильный ход:

#include <iostream>
#include <string>
using namespace std;

class Base
{
public:
    Base(string n, string b) : number(n), base(b) {}
    virtual string whatBaseAreYou(string) = 0;
    virtual double toDec(const Base&) { whatBaseAreYou(base); }  
protected:
    string number;
    string base;
};

class Hex : public Base
{
public:
    virtual double toDec(const Base&);
};

class Binary : public Base
{
public:
    virtual double toDec(const Base&);
};

int main()
{
    string number,base;
    cin >> number >> base;
    Base* b = new Base(number,base); //I know this line is compile error.. I don't know how to implement this...
}

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

0
mhm 4 Янв 2018 в 14:05

1 ответ

Лучший ответ

Я думаю, вам следует изучить шаблон фабричного метода. Это вернет вам указатель на ваш базовый класс, и вы сможете вызвать метод toDec.

Обычно метод factory требует, чтобы вы использовали какой-либо оператор switch, но если вы не хотите делать это любой ценой, посмотрите, как реализовать factory без использования if или переключателей здесь:

https://stackoverflow.com/a/3502010/8855783

Это будет работать только в том случае, если конструктору каждого производного класса (из Base) нужны те же аргументы.

1
wdudzik 4 Янв 2018 в 11:59