2011-10-24 6 views
5

Nếu tôi có giao diện và nhiều lớp thực hiện giao diện này, bây giờ tôi có thể chuyển làm đối số chỉ loại của lớp chứ không phải đối tượng không?Loại lớp C++ làm đối số

một cái gì đó như thế này:

Interface *creatClass(class : Interface){ 
    return new class(); 
} 

EDIT:

template <class T> 
IFrame *creatClass(){ 
    return new T(); 
} 

void dfg(){ 
    IFrame *lol = creatClass<Button>(); 
} 

error C3206: 'creatClass' : invalid template argument for 'Dist_Frame', missing template argument list on class template 'Button' 

PS. Button được thừa kế IFrame

Trả lời

12

Nó được gọi là "Template".

template <class T> 
T *creatClass(){ 
    return new T(); 
} 

Bạn sẽ phải gọi nó theo cách này:

class InterfaceImpl : public Interface {...}; 
// ... 
InterfaceImpl *newImpl = creatClass<InterfaceImpl>(); 

sửa

Bạn cũng có thể thử loại này, để đảm bảo bạn chỉ tạo ra các trường hợp Interface:

template <class T> 
Interface *creatClass(){ 
    return new T(); 
} 

chỉnh sửa để chỉnh sửa của bạn

tôi đã cố gắng mã kiểm tra này:

#include <iostream> 
using namespace std; 

class IFrame{ 
    public: 
     virtual void Create() =0; 
}; 

class Button : public IFrame{ 
    public: 

     virtual void Create(){ cout << "In Button" << endl;}; 
}; 

template <class T> 
IFrame *creatClass(){ 
    return new T(); 
} 


int main() 
{ 
    IFrame *lol = creatClass<Button>(); 
    lol->Create(); 
} 

Làm việc chính xác như mong đợi. Bạn phải có một số lỗi mã hóa khác trong định nghĩa lớp học của bạn. Gỡ lỗi nó, nó không có gì để làm với câu hỏi ban đầu của bạn.

+0

xem chỉnh sửa – Vladp

+0

@vladp - xem xét nó. – littleadv