c++ - 派生自在私有(private)范围内声明的类

标签 c++ c++11 inheritance inner-classes

我目前正在重构一些遗留代码,并希望将多个 if...elseif... 语句分解为一系列实现各种策略的类。

因为我必须访问原始对象的内部结构,所以我将把新类声明为嵌套类;由于外部世界的任何人都不应访问它们,因此我宁愿在私有(private)范围内声明它们。

为了尽可能少地暴露实现细节,我想知道是否可以在头文件中仅转发声明基本策略类,并将所有子类声明放在实现文件中。代码示例如下:

-- 头文件

class MyUglyClass
{
private:
    class IStrategyBase;
    IStrategyBase* sPtr;
    // class ActualImplementation; // this is what I'd like to avoid
    // class YetAnotherImplementation; // as above
    // blah blah blah
};

-- 实现文件

class MyUglyClass::IStrategyBase
{
    virtual ResultType DoSomething(SomeType someParameter) = 0;
    // could expose some MyUglyClass members, since 
    // derived classes wouldn't inherit friendship
};

class ActualImplementation: public MyUglyClass::IStrategyBase
{
    ResultType DoSomething(SomeType someParameter) override
    {
        // Do actual work
    }
}

class YetAnotherImplementation: public MyUglyClass::IStrategyBase
{
    ResultType DoSomething(SomeType someParameter) override
    {
        // Doing something really tricky & clever for corner cases
    }
}

当然,编译器会报错,因为 IStrategyBase 不可访问;我可以通过将 ActualImplementationYetAnotherImplementationIStrategyBase 一起 fwd 声明到头文件中来解决这个问题,但我宁愿避免这种情况,因为如果需要新策略,我需要更改标题。

我也可以在公共(public)范围内声明 IStrategyBase,但我更愿意将其保密以避免其他人弄乱它。

当然,我假设非 fwd 声明的子类不会继承与 MyUglyClass 的友元,因此我必须将相关数据公开给 IStrategyBase protected 成员.

有什么方法可以实现我可能会错过的吗?

编辑:

感谢所有发表评论的人,我意识到即使在公共(public)范围内声明,也没有人可以乱用 IStrategyBase 类,因为类定义也将埋在实现文件中。我现在想知道是否可以让派生类访问 MyUglyClass 的内部结构,而不必将它们与 IStrategyBase 一起 fwd 声明。我猜答案是否定的,因为友元不会被继承,但也许我还缺少一些 C++ perk。

最佳答案

一种可能性(这不是 pimpl 惯用语,只是一种可访问性 hack):

class MyUglyClass
{
private:
    struct Impl; // Is automatically "friend struct Impl;"
    class IStrategyBase;
    IStrategyBase* sPtr;
    // class ActualImplementation; // this is what I'd like to avoid
    // class YetAnotherImplementation; // as above
    // blah blah blah
};

class MyUglyClass::IStrategyBase
{
public:
    virtual int DoSomething(int someParameter) = 0;
    // could expose some MyUglyClass members, since 
    // derived classes wouldn't inherit friendship
};

struct MyUglyClass::Impl
{
    class ActualImplementation: public MyUglyClass::IStrategyBase
    {
        int DoSomething(int someParameter) override
        { (void) someParameter; return 1;}
    };

    class YetAnotherImplementation: public MyUglyClass::IStrategyBase
    {
        int DoSomething(int someParameter) override
        { (void) someParameter; return 2; }
    };
};

int main() {}

关于c++ - 派生自在私有(private)范围内声明的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36426122/

相关文章:

java - 识别数组

c++ - 如何定义和使用 boost::function with "optional arguments"?

c++ - Mac OS X 拒绝创建我的 OpenGL 窗口

c++ - 如何测试类型是否是具有非类型参数的模板的特化?

c++ - 迭代器 - 在 C++11 中没有匹配的删除函数

c++ - 具有公共(public)非虚拟析构函数的类是否应标记为 "final"?

c++ 如何将模板应用于模板类的子/友元?

objective-c - 为什么继承需要是 "subclass"NSObject?

c++ - 用于使用 ostream 左移语法替换 printf 样式调用的正则表达式

c++ - 违背 promise ,难以弄清楚 (C++)