2016-05-02 18 views
-2

Ich habe übergeordnete Klasseaccesing Methode einer anderen Klasse von Vektor

class Data 
{ 
}; 

Klassen, die von Klasse Daten erben:

class Struct : public Data 
{ 
    public: 
    Struct & AddNewType (const string & name, Data * x) 
    { 
    v . push_back (x); 
    return *this; 
    } 

    void Print (void) const 
    { 
    for (unsigned int i = 0; i < v . size(); i++) 
     cout << v[i]->GetSize(); 
    } 

    private: 
    vector<Data*> v; 
}; 

class Integer : public Data 
{ 
    public: 
    int GetSize (void) const 
    { 
     return 4; 
    } 
}; 

Hauptfunktion:

int main (void) 
{ 
    Struct a; 
    a . AddNewType ("Integer", new Integer); 
    a . Print(); 
    return 0; 
} 

Wenn ich a.Print() es nenne gibt mir diesen Fehler:

practice.cpp: In member function ‘void Struct::Print() const’: 
practice.cpp:40:21: error: ‘class Data’ has no member named ‘GetSize’ 
     cout << v[i]->GetSize(); 

Kann mir bitte jemand sagen, wie ich das beheben kann? Der Hauptzweck besteht darin, verschiedene Pseudodatentypen im Vektor zu speichern. Aber wenn ich Vektor mit diesen Datentypen loopen will und Funktion GetSize von ihm rufe, gibt es mir Fehler, den ich oben bekanntgab.

+2

Es sieht aus wie Sie eine [Lektion] müssen (http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm) auf Polymorphismus. – NathanOliver

+0

@NathanOliver Ja, ich mache – kvway

+0

Bitte verwenden Sie keine vorangestellten oder nachfolgenden Leerzeichen mit '.' oder' -> '. – Nacho

Antwort

1

Ihre vector v speichert Objekte des Typs Data*. Ihre Data Klasse implementiert jedoch nicht die GetSize() Methode und damit den Compiler (richtig) Fehler, weil diese Methode nicht existiert.

Es spielt keine Rolle, dass Ihre Unterklassen es implementieren, da der Compiler nicht weiß, ob Sie eine Unterklasse oder die Basisklasse übergeben.

Sie sollten die GetSize() Methode, um Ihre Datenklasse hinzufügen, das heißt

class Data { 
    public: 
     virtual int GetSize() const = 0; 
} 

dies auch Kräfte Kind-Klassen, das GetSize() -Methode zu implementieren. Wenn Sie ein Standardverhalten zur Verfügung stellen möchten, können Sie eine Default-Implementierung zur Verfügung stellen, das heißt

class Data { 
    public: 
     virtual int GetSize() const { return 0; }; 
} 
+0

Ja, danke, es funktioniert, aber was wäre, wenn ich einen privaten Vektor in der Integer-Klasse hätte und diesen Vektor wie diese Methode aufrufen möchte? Ich möchte nicht, dass der Vektor in der Klasse Clas Data als geschützt ist. Gibt es eine andere Methode? – kvway

+1

Sie können die GetSize() - Methode in Ihrer Integer-Klasse überschreiben und dann auf diesen privaten Vektor zugreifen. Ich empfehle wirklich, ein Tutorial über Polymorphismus zu lesen – tobspr

Verwandte Themen