2010-12-22 5 views
1

Je tente d'hériter d'une classe à partir d'un vecteur C++ et de l'initialiser au niveau du constructeur. Comment fait-on ça? Par exemple:Hériter des vecteurs et initialisation

class Dataset:public std::vector<float>{ 
    public: 
      Dataset(vector<float> val):*baseclass*(val){} 
      // bruteforce way. // Dataset(vector<float> val){//for every val[i] call push_back(val[i]);} 

ofcourse il n'y a rien que baseclass, ce que je veux dire par la déclaration ci-dessus est que je veux initialiser les données du vecteur avec val. Comment puis-je le faire sans push_back ing chaque élément?

Répondre

8

Ne dérivez pas de std::vector<>. Cette classe n'a jamais été conçue pour être dérivée. Utilisez une instance de la classe en tant que membre à la place:

struct Owns { 
    Owns() : the_vector_(42, 128) { } 

private: 
    std::vector<float> the_vector_; 
}; 
+0

Dériver en utilisant l'héritage privé est vraiment une bonne chose. – dalle

+0

Pas tellement, sauf si vous avez besoin d'accéder aux membres protégés de la classe de base. C'est Jamais (tm) le cas avec 'std :: vector'. – wilhelmtell

+1

@ user519770 Si vous voulez l'interface du vecteur, vous allez devoir l'écrire vous-même. Je veux dire, écrire l'interface, et partout où vous voyez, vous pouvez faire suivre les appels à l'instance du vecteur membre. Voir par exemple comment 'std :: stack' se comporte dans les en-têtes standard de votre compilateur. Cela aussi est un adaptateur de conteneur. – wilhelmtell

4

Vous pouvez écrire:

Dataset(const vector<float> &val): std::vector<float>(val) {} 

mais à la fin, vous devriez vraiment pas hériter publiquement de std::vector. Il y a des indices multiples qui montrent que std::vector est tout simplement pas destiné à être dérivé:

  • Pas destructor virtuel
  • Aucun membre protégés
  • Aucune des fonctions virtuelles

Vous ne pouvez pas empêcher quiconque de traiter votre objet Dataset comme un std::vector<float>, parce que l'héritage public signifie que Datasetest unstd::vector<float>, et cela échouera lamentablement si quelqu'un tente de supprimer un objet Database via un pointeur std::vector<float>.

Si vous souhaitez réutiliser std::vector, utilisez un membre std::vector privé ou hériter privé et d'exposer ce qui devrait être par le biais using déclarations.

+0

Je veux avoir des opérations telles que push_back, pop_back et itérateurs sur mon ensemble de données, c'est la raison pour laquelle je hérite. quelle alternative suggérez-vous? – blueskin

+0

@ user519770: la solution immédiate est d'avoir un membre privé 'std :: vector ' et d'implémenter vos opérations 'Database' en transmettant les appels au vecteur membre. – icecrime