如果我有一个简单的头文件:
namespace aNamespace {
class AClass {
public:
AClass();
~AClass();
bool Init();
void Shutdown();
};
}
在相应的CPP文件中实现此类的“正确”方法是什么?我可以看到两个选项:
选项A
namespace aNamespace {
class AClass {
public:
AClass() { ... }
~AClass() { ... }
bool Init() { ... }
void Shutdown() { ... }
};
}
选项B
namespace aNamespace {
AClass::AClass() { ... }
AClass::~AClass() { ... }
bool AClass::Init() { ... }
void AClass::Shutdown() { ... }
}
我看到的选项B 问题是,很难将特定于实现的成员添加到
AClass
-例如如果实现需要std::wstring
或类似的存储变量怎么办;但是该变量未在头文件中定义吗?我之所以这样问,是因为我可能希望有
AClass
的多个实现,并根据某个外部变量(例如目标平台或体系结构)选择要链接的那个。 最佳答案
另一个选择是实际指定每个实现平台的名称,并在 header 中使用一个简单的typedef开关来控制根据目标/体系结构选择哪个:
#ifdef target1
typedef AClass Target1ClassImplementation;
#elif defined target2
typedef AClass Target2ClassImplementation;
#else
#error AClass is not implemented for current target
#endif
如果需要,可以将通用接口(interface)封装在派生的基础类中。由于从某种意义上说哪个实现是针对哪个目标的,在更明确的意义上,它更不容易出错,而无论 header 之外的平台目标如何,都允许使用AClass。
关于c++ - 分离接口(interface)和C++实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20644166/