-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

3 に答える 3

4

Anstd::vector< std::unique_ptr<Base> >はまさにそれです: 塩基へのポインタで満たされたベクトルです。また、派生クラスのオブジェクトがそれらのポインター/参照の背後にある場合でも、基本クラスのポインター/参照を介して派生クラスのコンテンツにアクセスすることはできません。

これはこれと違いはありません:

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

これは、背後infoに派生クラスのオブジェクトがないという意味ではありません。がある。ただし、基本クラスのインターフェイスを介して利用できるもの以外にはアクセスできません。それが基本的な OO です。

于 2010-07-22T14:25:30.400 に答える
1

いいえ、基本クラスへのポインターがありますがInfo、コンパイラーが言うように、という名前のメンバーはありませんsomeInfo。そのポインターは引き続き を指しSubInfoますが、基本クラス ポインターを介して派生クラス メンバーにアクセスすることはできません。

フィールドへのアクセスが本当に必要な場合は、dynamic_castダウンキャストを使用する必要があります。結果をチェックして、キャストが有効であることを確認してください。

于 2010-07-22T14:25:59.130 に答える
1

それが言っていることは本当です

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

そうではありません。試みているように、多態的な方法で子メンバーにアクセスすることはできません。

クラス Info に仮想メンバー関数が必要になります。たとえば、GetSomeInfo()純粋な仮想にするか、基本クラスで何か興味深いものを返すことができます。次に、子クラスで返すことができますsomeInfo

于 2010-07-22T14:26:26.873 に答える