打破两个相互依赖的类的循环依赖

时间:2021-06-02 15:51:11

标签: c++ circular-dependency friend forward-declaration

我的程序的一部分基本上归结为下面的代码,由于循环依赖而无法编译。我知道之前有关于这个主题的讨论,但之前的解决方案(至少我找不到)都不能解决我的情况:

Database changed
MySQL [mydatabase]> SELECT count(*) FROM mydatabase.DomainVersions AS
dv LEFT JOIN domains AS d ON dv.DomainId = d.DomainId WHERE
dv.TemplateId LIKE 'companyDC-Vpc_2021-05%' AND (d.DomainMode =
'"VPC"' OR d.DomainMode = '"CONNECT"') AND NOT DomainState =
'"Deleted"' AND NOT DomainState = '"Deleting"' AND NOT DomainState =
'"Failed"';
+----------+
| count(*) |
+----------+
|      397 |
+----------+
1 row in set (0.20 sec)

MySQL [mydatabase]> Ctrl-C -- exit!
Aborted
[/home/myself]
    myself@devbox $ mysql -u $mysqlUsername --password=$mysqlPasswd -h
$mysqlHostname -e "use mydatabase; SELECT count(*) FROM
mydatabase.DomainVersions AS dv LEFT JOIN mydatabase.domains AS d ON
dv.DomainId = d.DomainId WHERE dv.TemplateId LIKE
'companyDC-Vpc_2021-05%' AND (d.DomainMode = '"VPC"' OR d.DomainMode
= '"CONNECT"') AND NOT DomainState = '"Deleted"' AND NOT DomainState
= '"Deleting"' AND NOT DomainState = '"Failed"';"
+----------+
| count(*) |
+----------+
|        0 |
+----------+

B.h

#ifndef A_H
#define A_H

#include <iostream>

#include "B.h"

class A
{
  public:
    typedef struct a_struct
    {
      int x;
      int y;
    }a_struct_t;

    void print_something() { std::cout << "Hello world" << std::endl; }
  
  private:
    typedef struct another_struct
    {
      int x;
      a_struct_t a_struct;
    }another_struct_t;
    
    friend void B::b_func1();
};
    
#endif

B.cpp

#ifndef B_H
#define B_H

#include "A.h"

class B
{ 
  public:
    void b_func1();
    A::a_struct_t b_func2();
};

#endif

try.cpp

#include "B.h"

void B::b_func()
{ 
  A::another_struct_t another_struct;
  // Do something with another_struct;
} 

A::a_struct_t B::b_func2()
{
  A::a_struct_t a_struct;
  return a_struct;
}

问题是 #include "A.h" int main() { A a_object; a_object.print_something(); return 0; } 不能在没有 class A 的情况下在 Ah 中只与 void B::b_func1() 交朋友并且完全定义 #include "B.h",但是 class B 也不能在 Bh 中使用 class B 而不使用 A::a_struct_t 并完全定义 include "A.h"。我已经尝试在 B.h 中向前声明 class A,但我仍然无法在 B.h 中使用 class A,因为 A::a_struct_t 是一个不完整的类型。

我可以将 class A 移到 a_struct_t 中,这有效,但它确实属于 class B。此外,我可以在 A.h 中与整个 class A 交朋友,而不是 class B,这也有效,但理想情况下,我只想与 #include "B.h" 交朋友,而不是整个 void B::b_func1()。有没有办法使这项工作?提前致谢,

附言- 我读过关于前向声明的内容,这是另一个线程中的最高评论。不幸的是,这在我的情况下不起作用,至少我无法以摆脱 class B

的方式应用前向声明

0 个答案:

没有答案