2010-07-22 4 views
-1
g++ -std=gnu++0x main.cpp 
In file included from main.cpp:6:0: 
CustArray.h: In constructor 'CustArray::CustArray()': 
CustArray.h:26:32: error: 'class Info' has no member named 'someInfo' 
make: *** [all] Error 1 
/* 
* Info.h 
* 
*/ 

#ifndef INFO_H_ 
#define INFO_H_ 

class Info 
{ 
    friend class CustArray; 
}; 

#endif /* INFO_H_ */ 


/* 
* SubInfo.h 
* 
*/ 

#include "Info.h" 

class SubInfo : public Info 
{ 

const int someInfo; 

public: 
    SubInfo(const int someInfo):someInfo(someInfo){} 
}; 

#include <vector> 
#include <memory> 
#include "Info.h" 
#include "SubInfo.h" 

template<typename T> 
struct ptrModel 
{ 
    typedef std::unique_ptr<T> Type; 
}; 

//Alias shortener. 
typedef ptrModel<Info>::Type ptrType; 

class CustArray 
{ 

protected: 
    std::vector<ptrType> array; 

public: 
    CustArray() 
    { 
     ptrType el_init(new SubInfo(1)); 
     array.push_back(std::move(el_init)); 
     int someInfo = (*(array[0])).someInfo; 
    } 

}; 

/* 
* main.cpp 
* 
*/ 

#include "CustArray.h" 
#include <vector> 

int main() 
{ 
    CustArray seq; 

    return 0; 
} 

ответ

4

std::vector< std::unique_ptr<Base> > только что: вектор заполнены с указателями на базах. И вы не можете получить доступ к содержимому производного класса с помощью указателей/ссылок базового класса - даже если объекты производных классов находятся за этими указателями/ссылками.

Это ничем не отличается от этого:

SubInfo si(1); 
Info& info = si; 
info.someInfo; // won't compile 

Это не значит, что за info не существует производный класс объект. Там есть. Но вы не можете получить к нему ничего доступного, кроме того, что доступно через интерфейс базового класса. Это базовое ОО.

1

Нет, у вас есть указатель на базовый класс Info, который, по словам компилятора, не имеет члена по имени someInfo. Этот указатель по-прежнему указывает на SubInfo, но вы не можете получить доступ к членам производного класса с помощью указателя базового класса.

Если вам действительно нужен доступ к полю, вам нужно будет использовать dynamic_cast для передачи. Обязательно проверьте результат, чтобы убедиться, что акты действительны.

1

Что это говорит верно

error: 'class Info' has no member named 'someInfo'

Это не делает. Вы не можете получить доступ к дочерним элементам полиморфным способом, как вы пытаетесь.

Вам понадобится виртуальная функция-член в классе Info, такая как GetSomeInfo(), которая может быть чистой виртуальной или возвращать что-то интересное в базовом классе. Затем в классе ребенка он может вернуться someInfo