2013-06-07 1 views
0

Я пытался создать шаблон вложенной стратегии. Я получаю сообщение об ошибке, когда при вставке родительского класса в чисто виртуальный. Возможно ли это?C++ Вложенный шаблон стратегии, чистая виртуальная ошибка

Пример:

class Jacobi { 
private: 
    mat _V, _A; 
    int _n, _rotations; 

public: 
    class DiagAlg { 
    public: 
    virtual void diagonalize() = 0; 
    }; 
    class Cyclic : DiagAlg { 
    public: 
    void diagonalize(); 
    }; 

    vec getE(); 
    mat getV(); 
    mat getA(); 
    int getRotations(); 
    Jacobi(Jacobi::DiagAlg DA); 
    Jacobi(const mat& A); // could be done without user supply of base vectors 
    bool rotate(int p, int q); 

}; 

Resulst в следующей ошибке:

jacobi.h:28:26: error: cannot declare parameter ‘DA’ to be of abstract type ‘Jacobi::DiagAlg’ 
jacobi.h:15:9: note: because the following virtual functions are pure within ‘Jacobi::DiagAlg’: 
jacobi.h:17:16: note: virtual void Jacobi::DiagAlg::diagonalize() 

Реализация будет в CPP файл причины.

+0

Заметим, что '_V' является идентификатором, который зарезервирован для реализация. Лучше всего просто избегать ведущих '_'. –

ответ

2

Вам необходимо передать параметр по ссылке (или указателю) вместо значения.

Jacobi(Jacobi::DiagAlg const& DA); 

(Кроме того, на несвязанной ноте, не использовать идентификаторы, начинающиеся с символа подчеркивания и заглавной буквы. Те, зарезервированы для реализации.)

+0

Спасибо. Еще одна вещь, о которой мне было интересно, - как гладкий доступ к родительским частным переменным из подкласса «Циклический»? Должен ли «Циклический» вызвать родительский конструктор Якоби? И есть ли способ работать в этом интерфейсе. Как я вижу, нет смысла создавать виртуальный конструктор «DiagAlg» ... – Theis

1

По правилам вы не можете создать экземпляр абстрактного класса. Ваш переход по значению заставляет это. Добавить & или const & исправить.