Тип класса C ++ в качестве аргумента - PullRequest
7 голосов
/ 24 октября 2011

Если у меня есть интерфейс и много классов, которые реализуют этот интерфейс, могу ли я теперь передавать в качестве аргумента только тип класса, а не объекта?

как то так:

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 наследует IFrame

1 Ответ

15 голосов
/ 24 октября 2011

Он называется " Шаблон ".

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

Вам придется называть его так:

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

отредактировано

Вы также можете попробовать это, чтобы убедиться, что вы только создаете экземпляры Interface:

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

редактировать для редактирования

Я пыталсяэтот тестовый код:

#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();
}

Работает точно так, как ожидалось.У вас должны быть другие ошибки кодирования в определениях вашего класса.Отладка, это не имеет ничего общего с вашим первоначальным вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...