Проблема с dynamic_cast, требующая определения класса до кода - PullRequest
0 голосов
/ 01 февраля 2019

У меня сейчас проблемы с dynamic_cast <> и тем, как я структурировал свой код.Итак, у меня есть класс Manager, который получает указатель и пытается проверить, является ли он производным объектом, и, если это так, запустить некоторые дополнительные коды в операторе if.Но для того, чтобы dynamic_cast <> работал, требуется, чтобы определение класса предшествовало фактическому использованию dynamic_cast <>.

Итак, я поменял месторасположение класса Manager и определение класса Derived, чтобы сделатьопределение производного класса должно прийти раньше, чем класс Manager.Но теперь у меня появляются сообщения об ошибках, в которых говорится, что «Менеджер» - неопределенный тип.Я предполагаю, что для передачи Manager в качестве ссылки класс Derived требует, чтобы сначала было определено определение класса Manager.

Мое лучшее решение, о котором я могу подумать, это вместо передачи класса Manager в качестве ссылки,передать его в качестве указателя (который я не очень фанат, так как знаю, что класс Manager всегда будет действительным указателем, поэтому бессмысленно делать его указателем).Мне просто интересно, есть ли какое-нибудь альтернативное и лучшее решение, чем у меня.

Заранее большое спасибо!

Редактировать: мне, к сожалению, нужны все определения классов и реализации длябыть в одном файле, поэтому разбиение их на файлы .h и .cpp является менее идеальным.Для людей, спрашивающих, да, это домашнее задание, но мой профессор хочет, чтобы это было в одном файле.

class BaseClass
{
    virtual VirtualClassName() = 0;
};

class Manager
{
    void FunctionNameOne(const BaseClass* const ClassPointer)
    {
        if(Derived* DerviedPtr = dynamic_cast<Derived*>(ClassPointer))
        {
            //Do stuff with DerviedPtr
        }
    }   
};

class Derived : public BaseClass
{
    Void FunctionNameTwo(const Manager& Manager)
    {
        //Do stuff with Manager
    }
};

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Мне пришлось очистить код, по крайней мере, вы должны иметь правильно сформированный код для работы, иначе ваши сообщения об ошибках будут бессмысленными.

class BaseClass
{
    virtual void VirtualClassName() = 0;
};

class Manager
{
    void FunctionNameOne(const BaseClass* const ClassPointer);
};

class Derived : public BaseClass
{
    void FunctionNameTwo(const Manager& Manager)
    {
        //Do stuff with Manager
    }
};

void Manager::FunctionNameOne(const BaseClass*  ClassPointer)
{
    if (const Derived* DerviedPtr = dynamic_cast<const Derived*>(ClassPointer))
    {
        //Do stuff with DerviedPtr
    }
}

Обратите внимание, что я определяю FunctionNameOne и использование динамическогоприведен после объявления Derived.

0 голосов
/ 01 февраля 2019

Обычно вы помещаете объявления в файлы .h вашего проекта, а реализации методов в файлы .cpp.

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

...