gpt4 book ai didi

c++ - 如何正确消除继承的 typedef 的歧义?以及如何缓解他们的创作?

转载 作者:行者123 更新时间:2023-11-28 05:03:23 27 4
gpt4 key购买 nike

让我们考虑一下我在其中创建的代码 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在每个类(class)公开可见。

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

  4. 如果我的Typedef类声明了更多别名,我有冲突 - 有没有比 using Typedef<Foo>::Ptr 更简单的方法来解决所有冲突? , ...::ConstPtr都是吗?

最佳答案

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

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> { ... };

这样,每个类都有一种简单的方法来提供自己的别名,即使是多重继承也是如此。

但是,正如我在评论中所解释的那样,我通常不建议采用这种方法。

应避免多重(公共(public))继承,因为它会产生强耦合。通常最好改用组合。接口(interface)类是一个异常(exception)(只有纯虚函数,如果您打算能够从其接口(interface)指针销毁对象,则可能是虚析构函数)。混合可能是多重继承可能有用的另一种情况,但在这种情况下,您将使用私有(private)继承,即使这样组合也可能更可取。耦合越少,如果您想进行重大更改,系统维护起来就越容易。

此外,正如我在评论中所解释的那样,自 std::unique_ptr<> 以来定义此类 typedef 可能不是一个好主意。具有与之关联的行为,出于文档目的,您编写 std::unique_ptr<A> Func(); 可能会更好反正。它使应该如何使用该功能更加明显。

关于c++ - 如何正确消除继承的 typedef 的歧义?以及如何缓解他们的创作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45389141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com