Tôi đang cố gắng triển khai mẫu nhà máy bằng cách đăng ký con trỏ hàm của lớp dẫn xuất đến nhà máy trong bản đồ tĩnh (thành viên của nhà máy) và tạo đối tượng nhìn lên bản đồ. Nhưng tôi nhận được một lỗi phân đoạn khi làm điều này.truy cập vào bản đồ tĩnh từ một hàm thành viên tĩnh - lỗi phân đoạn - C++
Đoạn Mã:
factory.cpp
typedef Shape* (*Funcptr)();
std::map<int,Funcptr> Factory::funcmap;
int Factory::registerCreator(int ShapeID, Shape *(*CFuncptr)()) {
Factory::funcmap[ShapeID] = CFuncptr;
return 1;
}
Shape* Factory::CreateObject(int ShapeID) {
std::map<int,Funcptr>::iterator iter;
iter = funcmap.find(ShapeID);
if(iter != funcmap.end()){
return iter->second();
}
return NULL;
}
factory.h
class Factory {
public:
Factory();
virtual ~Factory();
static int registerCreator(int, Shape *(*CFuncptr)());
Shape* CreateObject(int);
private:
static std::map<int,Funcptr> funcmap;
};
Square.cpp
static Shape *SquareCreator() {
return new Square;
}
static int SquareAutoRegHook = Factory::registerCreator(1,SquareCreator);
On tạo đối tượng cho Nhà máy trong chính nộp một phân đoạn về lỗi xảy ra. Bạn có thể đề nghị nếu tôi làm sai điều gì đó. Tôi đang sử dụng CppUTest cho TDD và không chắc chắn làm thế nào để gỡ lỗi này.
Hiển thị typedef cho 'Funcptr'. Bạn có thể viết lại mã của bạn để nó sử dụng typedef ở khắp mọi nơi (và kiểm tra)? Ngoài ra, tại sao 'SquareCreator()' khai báo 'tĩnh'? –
@KerrekSB: vẫn không thay đổi. – Saaras
Không liên quan, tôi thậm chí không chắc chắn bây giờ nếu con trỏ chức năng là tương thích covariantly. Tôi chỉ cố gắng tự mình thử nghiệm, và tôi chỉ bị lỗi "không thể chuyển đổi" được. –