2013-06-07 1 views
0

J'essayais de créer un schéma de stratégie imbriqué. Je reçois une erreur comme lors de la création de la classe parent imbriquée purement virtuelle. Cette idée est-elle même possible?C++ Patterne de stratégie imbriquée, erreur virtuelle pure

Exemple:

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 l'erreur suivante:

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() 

Les implémentations sera dans le fichier cpp de cause.

+0

Notez que '_V' est un identifiant qui est réservé la mise en oeuvre. Il est préférable d'éviter de laisser le champ "_" entièrement. –

Répondre

2

Vous devez transmettre le paramètre par référence (ou pointeur) plutôt que par valeur.

Jacobi(Jacobi::DiagAlg const& DA); 

(également, sur une note sans rapport, ne pas utiliser des identificateurs commençant par un trait de soulignement et une lettre majuscule. Ces derniers sont réservés pour la mise en œuvre.)

+0

Merci. Une autre chose que je me demandais était de savoir comment accéder le plus facilement possible aux variables privées parentes de la sous-classe "Cyclique"? Est-ce que "Cyclic" devrait appeler le constructeur parent de Jacobi? Et existe-t-il un moyen de travailler cela dans l'interface. Comme je peux le voir, cela n'a pas de sens de faire un constructeur virtuel du "DiagAlg" ... – Theis

1

Par règles, vous ne pouvez pas créer d'instance d'une classe abstraite. Votre passage en valeur forçant cela. Ajouter & ou const & pour corriger.

Questions connexes