Как динамически выделить память для полиморфного типа данных? - PullRequest
0 голосов
/ 04 декабря 2010

У меня есть установленный класс, который может полиморфно хранить и управлять любым типом Multinumber. Это может быть объект типа Pair, Rational или Complex. Проблема, с которой я сталкиваюсь, состоит в том, что этот класс требует динамического управления памятью, и во многих случаях, таких как функция ниже, я не знаю, какой тип выделить. Поскольку набор не зависит от типа, я не могу знать, должен ли я использовать Multinumber * var = new Complex, Rational или Pair. Есть ли способ проверить тип того, что я добавляю первым, или сохранить эту информацию в другом типе данных без эффекта среза? Одна функция, где у меня есть эта проблема, это:

bool Set::addElement(Multinumber* newElement)
{
    bool success = false;
    if(isFull())
    {
        resize();
    }
    if(!isMember(newElement))
    {
        setArray[numElements] = newElement;
        numElements++;
        success = true;
    }
    return success;
}

РЕДАКТИРОВАТЬ: я говорю о ситуациях, когда это только место, которое я мог бы выделить, например, когда оператор + вызывается и должен немедленно отправить объект сюда, а вызывающий класс не знает какой тип. Это происходит в моем коде в операторе Set + перегрузка, так как я Set не знаю, что он хранит.

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

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

1 голос
/ 04 декабря 2010

Вы можете использовать оператор typeid , чтобы проверить фактический тип класса newElement, как показано ниже:

if (typeid(*newElement) == typeid(Complex))
{
    setArray[numElements] = new Complex;
    // anything else
}

setArray должен быть массивом из нескольких номеров *.

...