【发布时间】:2022-02-03 18:25:54
【问题描述】:
我正在尝试为我的项目实现类似于此 sn-p 的访问者模式。
但是代码正在吐出运行时错误。它打印的错误是bad_weak_ptr
.代码本身似乎是正确的,我找不到设计模式的任何问题。
这可能是由于智能指针而发生的。
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);
}
【问题讨论】:
-
正确的all of the compiler errors,您的问题将比得到回答更容易。