скопировать дочерний в указатель родительского типа - PullRequest
1 голос
/ 27 апреля 2019

У меня есть родительский класс с несколькими дочерними элементами

namespace var
{
enum type {t_int, t_float, t_string, t_null};

class root
    {
    public:
        type t = t_null;
        root(type t) : t(t) {}
    }

class v_int : public root
    {
    public:
        int value;
        v_int() : root(t_int) {}
        v_int(int value) : value(value), root(t_int) {}
    }
class v_float : public root
    {
    public:
        float value;
        v_float() : root(t_float) {}
        v_float(float value) : value(value), root(t_float) {}
    }
class v_string : public root
    {
    public:
        std::string value;
        v_string() : root(t_string) {}
        v_string(std::string value) : value(value), root(t_string) {}
    }
}

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

var::root* source = new var::v_int(5);
var::root* copy = /*copy of source*/;

Да, я знаю, необработанные указатели,как я смею !!!В любом случае, я не собираюсь обсуждать выбор типа указателя.


Я знаю, что могу сделать что-то подобное с одним классом и объединением, но этот класс будет часто использоваться, и я не хочубудущее "v_uint8_t" займет столько же места, сколько "v_int64_t"

1 Ответ

1 голос
/ 27 апреля 2019

Я не уверен, что понимаю, о чем вы спрашиваете, вы спрашиваете о способе копирования элемента без необходимости переключения потенциальных подклассов?

Если это так, просто добавьте чисто виртуальную функцию-член к вашему root классу:

class root{
  // [...]
  public:
    virtual root* clone() const = 0;
  // [...]
};

И реализовать это в подклассах:

class v_int : public root{
  // [...]
  public:
    root* clone() const override{
      return new v_int{this->value};
    }
  // [...]
};

Кроме этого, в вашем примере вы не показываете никакого наследования (кроме вызова конструктора).

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