2012-08-17 31 views
5

Tôi đang sử dụng Luabind để hiển thị công cụ trò chơi của tôi cho Lua. Gần đây tôi gặp rắc rối khi tôi phát hiện ra rằng không có cách nào để tôi tạo một "mới", ví dụ: GUIObject * obj = new GUIObject() trong Lua, thay vào đó mọi thứ được tạo ra trong Lua thuộc sở hữu của Lua.Phương pháp mẫu C++ để tạo đối tượng

Vâng, đó không phải là vấn đề lớn, tôi quyết định chỉ tạo một loại mẫu Nhà máy trên các đối tượng, ví dụ: GUIManager tôi Có

class GUIManager { 
template <class T> T * CreateObject(T classType) 
{ 
    return new T(); 
} 
} 

My Luabind Bindings trông như thế này:

class_<GUIManager>("GUIManager") 
     .def("CreateObject", (GUILabel*(GUIManager::*)(GUILabel classType))&GUIManager::CreateObject<GUILabel>) 
     .def("CreateObject", (GUIImage*(GUIManager::*)(GUIImage classType))&GUIManager::CreateObject<GUIImage>) 

công trình Tất cả những gì tìm thấy trong Lua bằng cách gọi:

testLabel = theGUI:CreateObject(GUILabel()) 

Tuy nhiên tôi cảm thấy điều này không phải là "đúng" như Tôi chủ yếu tạo ra một đối tượng để truyền vào, tôi chắc chắn có một cách dễ dàng hơn nhưng tất cả các phương pháp khác mà tôi đã thử cho đến nay không đồng ý với trình biên dịch hoặc Luabind.

Hãy hỏi để biết thêm nếu cần thiết

Cảm ơn

+0

nếu bạn sẽ vượt qua một con trỏ bạn sẽ không cần phải tạo đối tượng mẫu T * CreateObject (T * classPtr) {return new T();} cho phép: testLabel = theGUI: CreateObject ((GUILabel *) NULL); và mẫu void CreateObject (T * & classPtr) { classPtr = new T(); } cho chỉ: theGUI: CreateObject (testLabel); – fantastory

+0

Sử dụng phương pháp đó làm cách nào để tôi biết Lua biết đối tượng nào tôi đang cố gắng tạo? theo như tôi biết tôi sẽ kết thúc với cùng một vấn đề tôi đã có trước đó của nó không biết được trong số hai chức năng ràng buộc để sử dụng và nâng cao một lỗi. – OpticFroggy

Trả lời

3

Kể từ Luabind Bindings của bạn đang sử dụng instantiations rõ ràng của phương pháp CreateObject của bạn, bạn có thể ràng buộc mỗi trường hợp để một tên khác nhau:

class_<GUIManager>("GUIManager") 
     .def("CreateLabel", /*...*/&GUIManager::CreateObject<GUILabel>) 
     .def("CreateImage", /*...*/&GUIManager::CreateObject<GUIImage>) 

Sau đó, mã Lua của bạn có thể được "đơn giản hóa" thành:

testLabel = theGUI:CreateLabel() 

Và bạn không cần tham số nữa trong phương thức nhà máy của mình.

class GUIManager { 
    template <class T> T * CreateObject() { return new T(); } 
}; 
+0

Hoàn hảo! Cảm ơn rất nhiều cho câu trả lời đó! – OpticFroggy

+0

@OpticFroggy: Bạn rất được hoan nghênh. – jxh

Các vấn đề liên quan