Skip to content

Instantly share code, notes, and snippets.

@HanatoK
Created March 14, 2022 20:44
Show Gist options
  • Save HanatoK/8d91a8ed71271e526d9becac0b20f758 to your computer and use it in GitHub Desktop.
Save HanatoK/8d91a8ed71271e526d9becac0b20f758 to your computer and use it in GitHub Desktop.
Use dynamic_pointer_cast to avoid bad_weak_ptr
#include <memory>
#include <iostream>
#include <type_traits>
#include <typeinfo>
#include <string>
struct Executor;
struct Intepreter;
struct Executor1 {
Executor1(const std::shared_ptr<Executor>& executor,
int x): parent(executor) {
std::cout << x << std::endl;
}
std::shared_ptr<Executor> parent;
};
struct Backend: public std::enable_shared_from_this<Backend> {
virtual ~Backend() {}
virtual void run() = 0;
};
struct Executor: public Backend {
const int data = 10;
virtual void run() override {
Executor1 x(std::dynamic_pointer_cast<Executor>(shared_from_this()), data);
}
};
struct Intepreter: public Backend {
const int data = 9;
virtual void run() override {
// Executor1 x(shared_from_this(), data);
}
};
std::unique_ptr<Backend> createBackend(int k = 0) {
if (k == 0) {
return std::make_unique<Executor>();
}
else {
return std::make_unique<Intepreter>();
}
}
class MainInstance {
private:
std::shared_ptr<Backend> backend;
public:
MainInstance(): backend(createBackend()) {
backend->run();
}
};
int main() {
MainInstance m;
std::unique_ptr<Backend> b = createBackend();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment