结构模式的正向声明



我被迫使用下面将要介绍的体系结构。前向声明是我试图实现的模式,以解决这个问题。

到目前为止我写的是:

class_with_config.h:

#include "config_file.h"
#include "i_class_with_config.h"
class ClassWithConfig : public I_ClassWithConfig
{
// specific implem
};

config_file.h:

struct A {
bool A1;
bool A2;
}
struct B {
bool B1;
bool B2;
}
struct C {
A a;
B b;
}

i_class_with_config.h:

struct B; // forward declaration of struct B
class I_ClassWithConfig
{
// definition of interface
};

side_class.h:

#include "i_class_with_config.h"
class SideClass
{
public :
SideClass(B* config);
private :
void Foo(void);
B* my_config;
};

side_class.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的答案更正了错字。

主要约束是我没有权利将config_file.h纳入side_class.h

您可以通过将side_class.hconfig_file.h包含到side_class.cpp中来解决这个问题,如下所示。

side_class.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
}
}

演示工作


还要注意,你应该在头文件中使用include保护符,就像上面链接的工作演示中所做的那样。

最新更新