エラーの原因はオブジェクトのスライスですか?
-
27-09-2020 - |
質問
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;
}
解決
std::vector< std::unique_ptr<Base> >
は、その単なるその単なるベースへのポインタでいっぱいのベクトルです。 派生クラスのオブジェクトがそれらのポインタ/参照の背後にある場合でも、基本クラスのポインタ/参照 を介して派生クラスのコンテンツにアクセスすることはできません。
これはこれとは変わらない:
SubInfo si(1);
Info& info = si;
info.someInfo; // won't compile
.
info
の後ろに派生クラスのオブジェクトがないという意味ではありません。有る。しかし、 あなたはそれにアクセスすることはできませんが、基本クラスインターフェイス を介して利用可能なものは何ですか。それは基本的なooです。
他のヒント
いいえ、基本クラスInfo
へのポインタを持ち、コンパイラは、someInfo
というメンバーを持っていません。そのポインタはまだSubInfo
を指していますが、基本クラスのポインタを介して派生クラスメンバーにアクセスすることはできません。
本当にフィールドにアクセスする必要がある場合は、dynamic_cast
をダウンキャストに使用する必要があります。キャストが有効であることを確認するために、必ず結果を確認してください。
言っていることは本当です
error: 'class Info' has no member named 'someInfo'
そうではありません。あなたが試みているようなポリモーフィックな方法で子メンバーにアクセスすることはできません。
Info クラスには次のような仮想メンバー関数が必要になります。 GetSomeInfo()
これは純粋な仮想であるか、基本クラスで興味深いものを返すかのいずれかです。その後、子クラスで返すことができます someInfo
所属していません StackOverflow