c++ - 基类和子类 "using Shared = std::shared_ptr<>"的问题

标签 c++ c++11 shared-ptr using

我刚刚解决了一个由在基类和子类中“使用共享”引起的错误。像这样:

class B: public A {
public:
    /**
     * Attention! This "using Shared" should be located before "using ResCallback " because
     * in class A, there is also a "using Shared".
     */
    using Shared = std::shared_ptr<B>;

    using ResCallback = std::function<void(const C& c, const char* data, size_t size, Shared b)>;

在另一个文件中,有类A:

class A {
public:
    using Shared = std::shared_ptr<A>;

过去,我把“using ResCallback”放在“using Shared”之前,然后就出现了问题。这让我怀疑“使用共享”。有没有更好的设计风格来避免这个bug源头?

最佳答案

如您所见,在基类和派生类中具有相同的类型名称但引用不同的类型是潜在的问题来源。

我会避免在两个类中使用相同的名称 ( Shared)。

我倾向于 APtrBPtr作为与 A 相同命名空间中的类型别名和 B分别使用 std::shared_ptr<A>A里面类,和 std::shared_ptr<B>B里面类。

如果你真的喜欢X::Shared std::shared_ptr<X> 的图案,那么您需要始终将其作为类定义中的第一个声明,然后它可以避免像您在此处看到的那样发生破坏的可能性。

关于c++ - 基类和子类 "using Shared = std::shared_ptr<>"的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59049119/

相关文章:

c++ - 使用基类引用而不是指针时出现意外的虚函数分派(dispatch)

c++ - 共享指针无需分配即可工作

C++ 智能指针性能以及与简单包装指针的差异

c# - 有什么理由在方法的第二行使用 'return' 吗?

c++ - 如何找出试图加载 libmysqlclient_r.so 库的内容

java - Unicode码指向字节并反转: how do you do that in C++?

C++和const reference to temporary binding问题(在C++0X中实现D语言传值传引用规则)

c++ - 如何判断整数表达式的结果是否为整数

c++ - 在数组中设置像素颜色

c++ - 在继承类中没有匹配的泛型委托(delegate)作为 lambda 参数