2010-07-22 58 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沒有一個派生類的對象。有。但是您無法訪問它的任何內容,但通過基類接口可用。這是基本的OO。

1

不,您有一個指向基類Info的指針,如編譯器所示,它沒有名爲someInfo的成員。該指針仍然指向SubInfo,但不能通過基類指針訪問派生類成員。

如果您確實需要訪問該字段,則需要使用dynamic_cast向下轉換。請務必檢查結果以確保演員生效。

1

什麼它所說的是真的

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

事實並非如此。您不能像嘗試一樣以多態方式訪問子成員。

您將需要Info類中的虛擬成員函數,如GetSomeInfo(),它可以是純虛擬的,也可以返回基類中有趣的內容。然後在兒童班,它可以返回someInfo