Является ли причиной ошибки объект нарезки? - PullRequest
0 голосов
/ 22 июля 2010
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;
}

Ответы [ 3 ]

4 голосов
/ 22 июля 2010

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

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

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

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

1 голос
/ 22 июля 2010

То, что он говорит, правда

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

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

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

1 голос
/ 22 июля 2010

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

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

...