gpt4 book ai didi

c++ - 包含多个 header 以实现多态性

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:23 34 4
gpt4 key购买 nike

我有一个接口(interface) ver as

// ver.h
class ver
{
public:
virtual void func()=0;
};

然后ver1ver2实现这个接口(interface)。 ver1ver2 的区别在于它们包含 header test\header.htest2\header.h。现在 test\header.htest2\header.h 不在我的控制之下,除了函数指针外大部分都是相似的,这就是 ver1 的原因ver2

// test\header.h
#ifndef header
#define header
typedef void
(*FuncPoint)(
struct_type_a
);
#endif

// test2\header.h
#ifndef header
#define header
typedef void
(*FuncPoint)(
struct_type_b
);
#endif

现在的实现

//ver1.h
#include "test\header.h"
class ver1:public ver
{
public:
FuncPoint f;
};

//ver2.h
#include "test2\header.h"
class ver2:public ver
{
public:
FuncPoint f;
};

ver1.cppver2.cpp将使用各自的f

现在多态行为在这里发挥作用

//something.cpp

#include "ver.h"
#include "ver1.h"
#include "ver2.h"
ver* somefunc()
{
if (some_condition)
return new ver1();
else
return new ver2();
}

由于something.cpp同时包含ver1.hver2.h,首先是test\header1.h 被包含并且由于包含保护,test\header2.h 未包含在内,因此没有为 class ver2 定义的 FuncPointsomething.cpp 编译失败。另一方面,ver1.cppver2.cpp 编译成功,因为只有一个 header.h 包含在内。

我可以在 something.cpp 中包含 ver1.h 之后做一个 #undef header 但这会给其他东西带来重新定义错误test\header.h1tes\header2.h 是一样的。

一个简单的解决方法是不要将 FuncPoint f 作为全局变量而不是成员变量,这样我就不必在中包含 test\header.h ver1.h 而不是 ver1.cpp

还有其他更好的方法来解决这个问题吗?

编辑:我可以在 something.cpp 中转发声明 struct_type_astruct_type_b 并避免包含 ver1.hver2 .hsomething.cpp 中。但是 ver1ver2 类也使用 test\header.h 中的其他东西(声明成员)(这在两个版本中都是相同的) .

最佳答案

不要在 ver1.hver2.h 中包含 header.h,而是在各自的 .cpp 文件中: FuncPoint 是一个指针,因此您可以使用前向声明。由于 ver1.hver2.h 都将包含在内,您需要重命名它,但是在暴露的地方(在 .cpp 文件中,您将能够使用原始的 FuncPoint 也是,因为你在那里只包含它的一个定义):

//ver1.h
#include "ver.h"
struct struct_type_a;
typedef void (*FuncPoint_a)(struct_type_a);
class ver1 : public ver
{
public:
FuncPoint_a f;
static ver1 *create();
};

此外,在 .cpp 文件中的 create() 静态方法中,必须要求创建多态对象。

按照您的代码,它将变为:

//something.cpp
#include "ver.h"
#include "ver1.h"
#include "ver2.h"
ver* somefunc()
{
if (some_condition)
return ver1::create();
else
return ver2::create();
}

通过这种方式,两个冲突的 header 将永远不会包含在同一个文件中。

我在 ver1.h(和 ver2.h)中添加了 ver.h,因为这是使用的源代码它。仅将它包含在 something.cpp 中是不正确的(ver1 和 ver2 需要它)- 但与当前问题无关。

关于c++ - 包含多个 header 以实现多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54232326/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com