我被迫使用下面将要介绍的体系结构。前向声明是我试图实现的模式,以解决这个问题。
到目前为止我写的是:
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.h
和config_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保护符,就像上面链接的工作演示中所做的那样。