Tôi đang tìm cách tốt nhất để triển khai mẫu chiến lược trong C++. Cho đến nay, tôi đã luôn luôn sử dụng cách chuẩn, trong đó bối cảnh có một con trỏ tới lớp cơ sở chiến lược như sau:Cách triển khai mẫu chiến lược trong C++ với std :: function
class AbstractStrategy{
public:
virtual void exec() = 0;
}
class ConcreteStrategyA{
public:
void exec();
}
class ConcreteStrategyB{
public:
void exec();
}
class Context{
public:
Context(AbstractStrategy* strategy):strategy_(strategy){}
~Context(){
delete strategy;
}
void run(){
strategy->exec();
}
private:
AbstractStrategy* strategy_;
Kể từ khi có con trỏ tới các đối tượng có thể dẫn đến hành vi xấu, tôi đang tìm kiếm để có cách an toàn hơn để triển khai mẫu này và tôi đã tìm thấy this question trong đó std::function
được đề xuất là cách tốt hơn để xử lý mẫu này.
Có thể ai đó vui lòng giải thích rõ hơn cách hoạt động của std::function
, có thể với ví dụ về mẫu chiến lược?
Trong trường hợp này, bạn sẽ triển khai F (chiến lược) như thế nào? Và tại sao bạn cần sử dụng std :: move? – gcswoosh
@Gabrielecswoosh Chiến lược này chỉ là bất kỳ con trỏ hàm hoặc đối tượng nào với 'toán tử()' bị quá tải.Ví dụ của tôi chuyển một lambda (định nghĩa 'void operator()() const'). 'std :: move' là để ngăn chặn một bản sao. – rightfold