如何在具有循环依赖关系的类中进行动态广播?

问题描述 投票:1回答:1

我想动态转换一个类:

A.h:

class A
{
};

B.h:

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':未声明的标识符

我认为这是由于类BC之间的循环依赖关系。我该如何解决这个问题?

c++ circular-dependency dynamic-cast
1个回答
2
投票

A.h

#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

A.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
© www.soinside.com 2019 - 2024. All rights reserved.