如果我有一个简单的头文件:

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/

10-11 22:42
查看更多