c++ 结构模式的前向声明

mm9b1k5b  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(153)

我不得不使用下面将要介绍的体系结构。前向声明是我试图实现的模式来解决这个问题。
以下是我目前所掌握的情况:

  • 带有配置的类.h:*
#include "config_file.h"
#include "i_class_with_config.h"

class ClassWithConfig : public I_ClassWithConfig
{
    // specific implem
};
  • 配置文件.h*:
struct A {
   bool A1;
   bool A2;
}

struct B {
   bool B1;
   bool B2;
}

struct C {
   A a;
   B b;
}
  • i_类与_配置.h*:
struct B; // forward declaration of struct B

class I_ClassWithConfig
{
  // definition of interface
};
  • 侧类.h*:
#include "i_class_with_config.h"

class SideClass
{
public :
   SideClass(B* config);

private :
   void Foo(void);
   B* my_config;
};
  • 侧_类.cpp*:
SideClass::SideClass(B* argConfig) : my_config(argConfig) 
{
}

void SideClass::Foo(void)
{
   if (my_config->B1 == true)
   {
      // do something
   }
}

我需要在我的SideClass实现中使用my_config,但是我得到
不允许指向不完整类类型“B”的指针
这看起来像是一个结构问题的前向声明,但这种模式与我所遇到的任何模式都不同。
主要限制是我无权将config_file.h包含到side_class.h
编辑1:根据来自莫斯科的@Stack Danny和@Vlad的回复更正了错字。

s3fp2yjn

s3fp2yjn1#

主要约束是我无权将config_file.h包含到side_class.h
您可以通过将side_class.hconfig_file.h包括到side_class.cpp中来解决此问题,如下所示。

侧类.cpp

#include "side_class.h"       //added this 
#include "config_file.h"      //added this 

SideClass::SideClass(B* argConfig) : my_config(argConfig) 
{
}

void SideClass::Foo(void)
{
   if (my_config->B1 == true)
   {
      // do something
   }
}

Working demo
另请注意,您应该像上面链接的工作演示中所做的那样,在标题中使用include guards。

相关问题