2013-06-11 2 views
3

Мне нужен способ вычисления различных типов аномалий в наборе данных. следовательно, я думал о наличии общего интерфейса Anomaly, который определяет интерфейс для конкретных аномалий. Тогда мое приложение может просто использовать интерфейс для перебора различных конкретных стратегий.Как создать экземпляр класса с разными аргументами

Основная проблема, с которой я сталкиваюсь, заключается в том, что для построения конкретных аномалий требуются разные входы. Например,

class Anamoly 
{ 
public: 
    template <typename T> 
    virtual Anamoly * getInstance(T &) = 0; 
    virtual void processAnamoly() = 0; 
    virtual bool containsAnamoly() = 0; 
    virtual void logAnamoly() = 0; 
}; 

Поскольку шаблоны функции не могут быть виртуальными, есть способ, чтобы обойти эту проблему, что позволит строительство бетонных Аномалии с разными входами, но, позвольте мне использовать общий интерфейс для отдыха поведение?

+5

Я не уверен, что понимаю, почему 'getInstance' является функцией-членом и виртуальной. Похоже, что это должна быть отдельная фабричная функция или фабричный класс, и тогда, я полагаю, не было бы необходимости, чтобы она была виртуальной. Иерархия классов аномалий на самом деле не связана с тем, как они генерируются, или это так? – jogojapan

+0

Вы правы, что проблему можно решить с помощью отдельного класса фабрики, но я пытался минимизировать количество требуемых классов. – Jimm

+7

Хорошо. Позвольте мне сказать, что минимизация количества классов является сомнительной амбицией (потому что это не помогает читаемости кода или производительности). Кроме того, имейте в виду, что отдельный класс или функция необязательно требует отдельного файла на C++. Вы можете поместить хорошую и чистую фабричную функцию в пространство имен, определенное в том же файле, или даже как статическую функцию базового класса «Anomaly». – jogojapan

ответ

1

Виртуальная функция с параметрами шаблона не будет работать, но вы можете использовать статическую функцию шаблона:

class Anomaly { 
public: 
    template <typename T> 
    static Anomaly * getInstance(T &); 
    virtual void processAnamoly() = 0; 
    virtual bool containsAnamoly() = 0; 
    virtual void logAnamoly() = 0; 
}; 

Затем, когда вы определяете соответствующий подкласс, осуществлять Anomaly::getInstance(), например, в myanomaly.cpp:

class MyAnomaly : public Anomaly { 
    // implement virtual functions 
}; 

Anomaly * Anomaly::getInstance(MyType & t) { 
    return new MyAnomaly(t); 
}; 

преимущество этого подхода заключается в том, что вам не нужно трогать файл anomaly.h заголовка всякий раз, когда вы добавляете новый класс, и вам не нужно подвергать подклассы вне их файла определения. Недостатки - это ошибки типа, которые попадают только в момент ссылки, а не во время компиляции.

Смежные вопросы