- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个接口(interface) ver
as
// ver.h
class ver
{
public:
virtual void func()=0;
};
然后ver1
和ver2
实现这个接口(interface)。 ver1
和 ver2
的区别在于它们包含 header test\header.h
和 test2\header.h
。现在 test\header.h
和 test2\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.cpp
和ver2.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.h
和ver2.h
,首先是test\header1.h
被包含并且由于包含保护,test\header2.h
未包含在内,因此没有为 class ver2
定义的 FuncPoint
和something.cpp
编译失败。另一方面,ver1.cpp
和 ver2.cpp
编译成功,因为只有一个 header.h
包含在内。
我可以在 something.cpp
中包含 ver1.h
之后做一个 #undef header
但这会给其他东西带来重新定义错误test\header.h1
和 tes\header2.h
是一样的。
一个简单的解决方法是不要将 FuncPoint f
作为全局变量而不是成员变量,这样我就不必在中包含 test\header.h
ver1.h
而不是 ver1.cpp
。
还有其他更好的方法来解决这个问题吗?
编辑:我可以在 something.cpp
中转发声明 struct_type_a
和 struct_type_b
并避免包含 ver1.h
和 ver2 .h
在 something.cpp
中。但是 ver1
和 ver2
类也使用 test\header.h
中的其他东西(声明成员)(这在两个版本中都是相同的) .
最佳答案
不要在 ver1.h
或 ver2.h
中包含 header.h
,而是在各自的 .cpp 文件中: FuncPoint
是一个指针,因此您可以使用前向声明。由于 ver1.h
和 ver2.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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!