Как сделать dynamic_cast в классах с круговой зависимостью? - PullRequest
1 голос
/ 19 января 2020

Я хочу динамически создать класс:

Ач:

class A
{
};

Bh:

class B
    : public A
{
public:
    void foo(A *a)
    {
        C* c = dynamic_cast<C*>(a);
    }
};

C .h:

class C
    : public A
{
public:
    void foo(A *a)
    {
        B* b = dynamic_cast<B*>(a);
    }
};

main. cpp:

#include "A.h"
#include "B.h"
#include "C.h"

int main()
{
}

Когда я компилирую, я получаю следующая ошибка:

'C': необъявленный идентификатор

Я думаю, что это из-за циклической зависимости между классами B и C. Как я могу решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 19 января 2020

А *

#ifndef _A_H
#define _A_H

class A
{
public:
    int x{ 0 };

    A() {}
    virtual ~A() {}
};

// definition
class B
    : public A
{
public:
    B() {}
    ~B() override {}

    void foo(A* a);
};

// definition
class C
    : public A
{
public:
    C() {}
    ~C() override {}

    void foo(A* a);
};

#endif _A_H

А. cpp

#include "A.h" // NECESSARY !
#include <iostream>

void
B::
foo(A* a)
{
    C* c = dynamic_cast<C*>(a);
    if (c)
    {
        std::cout <<
            "c->x = "
            << c->x
            << std::endl;
    }
}

void
C::
foo(A* a)
{
    B* b = dynamic_cast<B*>(a);
    if (b)
    {
        std::cout <<
            "b->x = "
            << b->x
            << std::endl;
    }
}

main. cpp

#include "A.h"

int main()
{
    B b;
    b.x = 1;
    C c;
    c.x = 2;

    b.foo(&c);
    c.foo(&b);

    return 0;
}

Используйте следующую команду для компиляции и выполнения, если вы используете gcc:

g++ -std=c++17 -I. -o main A.cpp main.cpp \
  && ./main

После запуска программы вы получите следующий вывод из приглашения:

c->x = 2
b->x = 1
0 голосов
/ 21 января 2020

Моя проблема решена. Решением было разделение заголовочного файла и файла реализации. cpp и включение всего .h файла в. cpp файл

...