代码之家  ›  专栏  ›  技术社区  ›  Xeverous

如何正确地消除继承的typedef的歧义?如何缓解他们的创作?

  •  0
  • Xeverous  · 技术社区  · 8 年前

    让我们考虑一下我在哪里创建的代码 Typedef

    #include <memory>
    
    template <typename T>
    struct Typedef
    {
        typedef std::unique_ptr<T> Ptr;
        typedef std::unique_ptr<const T> ConstPtr;
    };
    
    struct X : public Typedef<X> { Ptr Func(); }; // no problem, Ptr = std::unique_ptr<X>
    struct Y : public Typedef<Y> { Ptr Func(); }; // no problem, Ptr = std::unique_ptr<Y>
    
    struct A : public X, public Typedef<A>
    {
        using Typedef<A>::Ptr; // (A), better than typedef typename Typedef<A>::Ptr Ptr, am I right?
        Ptr Func();
    };
    
    struct B : public X, public Y, public Typedef<B>
    {
        using Typedef<B>::Ptr; // (B)
        Ptr Func();
    };
    

    一般来说,这没有问题,但当我从多个类继承时,我必须消除多个继承别名之间的歧义。

    1. (可能具有C++14/17功能)

    2. 如果没有,是否有更简单的方法自动为每个类创建别名?我不想 typedef std::unique_ptr<Foo> Ptr Foo::Ptr Foo::ConstPtr

    3. 最新的Eclipse氧气分析器坏了吗? 它通常正确理解代码(包括A),但突出显示(B)时出错:“typedef不明确”。在这种情况下,原因似乎是多重继承。GCC没有问题,编译时没有任何警告。

    4. 如果我的 定义类型 类声明了更多的别名,我有冲突-有比 using Typedef<Foo>::Ptr ...::ConstPtr 他们所有人?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Phil1970    8 年前

    如果你真的坚持这种行为,一种可能是添加额外的类。。。

    struct XBase { ... };
    struct YBase { ... };
    
    struct X : public XBase, public Typedef<X> { ... };
    struct Y : public YBase, public Typedef<Y> { ... };
    
    struct ABase { ... };
    struct BBase { ... };
    
    struct A : 
        public ABase, 
        public XBase, 
        public Typedef<A> { ... };
    
    struct B : 
        public BBase, 
        public XBase, 
        public YBase, 
        public Typedef<B> { ... };
    

    然而,正如我在评论中解释的那样,我一般不建议采取这种做法。

    应避免多重(公共)继承,因为它会产生强耦合。通常最好使用合成。接口类是一个例外(如果您希望能够从其接口指针销毁对象,则仅限纯虚拟函数和可能的虚拟析构函数)。混合可能是另一种情况,在这种情况下,多重继承可能很有用,但在这种情况下,您将使用私有继承,即使在这种情况下,组合也可能更可取。如果您想要进行重大更改,那么耦合越少,系统就越容易维护。

    正如我在评论中解释的那样,定义这样的typedef可能不是一个好主意,因为 std::unique_ptr<> std::unique_ptr<A> Func(); 无论如何它使函数应该如何使用变得更加明显。