2016-05-02 4 views
-2

У меня есть родительский классэкранным метод другого класса от вектора

class Data 
{ 
}; 

классы, которые наследуют от класса данных:

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; 
    } 
}; 

Основная функция:

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

Когда я называю a.Print() его дает мне эту ошибку:

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

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

+2

Похоже, что вам нужно [урок] (http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm) на полиморфизм. – NathanOliver

+0

@NathanOliver Да, я делаю – kvway

+0

Пожалуйста, не используйте предыдущие или завершающие пробелы с '.' или' -> '. – Nacho

ответ

1

vector v сохраняет объекты типа Data*. Однако ваш класс Data не реализует метод GetSize() и, следовательно, ошибки компилятора (правильно), поскольку этот метод не существует.

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

Вы должны добавить метод GetSize() к классу данных, т.е.

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

Это также вынуждает дочерние классы для реализации методы GetSize(). Если вы хотите, чтобы обеспечить поведение по умолчанию, можно обеспечить реализацию по умолчанию, т.е.

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

Да, спасибо, что это работает, но что, если бы у меня был частный вектор в классе Integer и хотел бы получить этот вектор, как этот метод? Я не хочу, чтобы этот вектор был в класе. Класс данных, защищенный, есть ли какой-либо другой метод? – kvway

+1

Вы можете переопределить метод GetSize() в своем классе integer и затем получить доступ к этому частному вектору. Я действительно рекомендую прочитать некоторые уроки о полиморфизме, хотя – tobspr