首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有智能指针的cpp中的访问者设计模式存在运行时错误。

带有智能指针的cpp中的访问者设计模式存在运行时错误。
EN

Stack Overflow用户
提问于 2022-02-03 00:26:57
回答 1查看 83关注 0票数 -1

我试图为我的项目实现类似于这个片段的访问者模式。但是代码正在泄漏一个运行时错误。它打印的错误是bad_weak_ptr。代码本身似乎是正确的,我找不到设计模式的任何问题。这可能是由于智能指针而发生的。

代码语言:javascript
复制
template<class T> class Beignet;
template<class T> class Cruller;

template<class T>
class PastryVisitor {
    public:
    virtual T visitBeignet(shared_ptr<Beignet<T>> beignet) = 0;
    virtual T visitCruller(shared_ptr<Cruller<T>> cruller) = 0;
};

template<class T>
class Pastry {
    public:
    virtual T accept(shared_ptr<PastryVisitor<T>> visitor) = 0;
};

template<class T>
class Beignet : public Pastry<T>, enable_shared_from_this<Beignet<T>> {
    
    public:
    T accept(shared_ptr<PastryVisitor<T>> visitor) override {
        return visitor->visitBeignet( this->shared_from_this() );
    }
};

template<class T>
class Cruller : public Pastry<T>, enable_shared_from_this<Pastry<T>> {
    
    public:
    T accept(shared_ptr<PastryVisitor<T>> visitor) override {
        return visitor->visitCruller( this->shared_from_this() );
    }
};

class PastryPrinter : public PastryVisitor<string>, enable_shared_from_this<PastryPrinter> {

    public:
    string print(shared_ptr<Pastry<string>> pastry) {
        return pastry->accept( shared_from_this() );
    }

    string visitBeignet(shared_ptr<Beignet<string>> beignet) override {
        return "Beignet";
    }

    string visitCruller(shared_ptr<Cruller<string>> cruller) override {
        return "Cruller";
    }

};

int main() {
    auto pastry = make_shared<PastryPrinter>();
    shared_ptr<Pastry<string>> chocolateBeignet = make_shared<Beignet<string>>();
    pastry->print(chocolateBeignet);
}
EN

回答 1

Stack Overflow用户

发布于 2022-02-03 00:54:29

你私下继承了std::enable_shared_from_this。它必须公开继承才能发挥作用:

代码语言:javascript
复制
class Cruller : public Pastry<T>, public enable_shared_from_this<Pastry<T>>

以及其他类中的等价物。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70964578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档