2013-12-03 3 views
0

У меня проблема с разрезанием данных, но я не знаю, как это исправить. Здесь у меня только один подкласс (B), но на самом деле у меня есть другие подклассы (в которых нет j).Участник подкласса не найден

Это мой код:

helloworld.h

#ifndef HELLOWORLD_H_ 
#define HELLOWORLD_H_ 

class A { 
public: 
    A(): i(5) {} 
    int i; 
}; 

class B: public A { 
public: 
    B(): A(), j(2) {} 
    int j; 
}; 
#endif /* HELLOWORLD_H_ */ 

helloworld.cpp

#include <iostream> 
#include <vector> 
#include "helloworld.h" 
using namespace std; 
int main() { 
    vector<A*> v; 
    v.push_back(new B()); 
    v.push_back(new B()); 
    vector<A*>::iterator it = v.begin(); 
    ++it; 
    cout << (*it)->j; 
    return 0; 
} 
+0

Изменение '' вектор для '' вектор является очевидным способом, чтобы исправить это. Я мог бы рассказать вам что-то более полезное, но мне нужно знать, что вы на самом деле пытаетесь сделать. – interjay

+0

Если у вас есть другие подклассы, которые не имеют 'j' в качестве члена, то что вы ожидаете от' (* it) -> j'? – interjay

+0

Я хочу, чтобы это возвращало значение 'j' (2 здесь). У меня есть функция, которая знает, что спросить, какой подтип –

ответ

1

Помимо @ interjay свой комментарий:

C++ не работает таким образом , Ваш класс A не знает, какие типы дочерних классов переменных будут иметь, поэтому он не сможет получить к ним доступ. Вместо этого вы можете использовать виртуальные функции.

Заголовок:

#ifndef HELLOWORLD_H_ 
#define HELLOWORLD_H_ 

class A { 
public: 
    A(): i(5) {} 

    virtual int GetJ() const = 0 ; 

private: 
    int i; 
}; 

int A::GetJ() const { 
    // Throw exception or return an error. 
} 

class B: public A { 
public: 
    B(): A(), j(2) {} 

    int GetJ() const ; 

private: 
    int j; 
}; 

int B::GetJ() const { 
    return j ; 
} 

#endif /* HELLOWORLD_H_ */ 

Главная:

#include <iostream> 
#include <vector> 
#include "helloworld.h" 
using namespace std; 
int main() 
{ 
    vector<A*> v; 
    v.push_back(new B()); 
    v.push_back(new B()); 
    vector<A*>::iterator it = v.begin(); 
    cout << (*it)->GetJ() ; 

    // Don't forget to clean up memory allocations, 
    // or better yet, use smart pointers. 
    return 0; 
} 
+0

Почему 'const = 0' необходимо (после' virtual int GetJ() ')? –

+0

Часть 'const' не требуется. Он просто говорит, что метод не меняет класс. '= 0' говорит, что это чистая виртуальная функция, и подклассы должны ее реализовать. – jliv902

+0

Все подклассы или хотя бы один? –

Смежные вопросы