Pergunta

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;
}
Foi útil?

Solução

Um std::vector< std::unique_ptr<Base> > é só isso:um vetor preenchido com ponteiros para bases.E você não pode acessar o conteúdo da classe derivada através de ponteiros/referências de classe base - mesmo que objetos de classes derivadas estejam atrás desses ponteiros/referências.

Isso não é diferente disso:

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

Isso não significa que atrás info não existe um objeto de classe derivada.Há.Mas você não pode acessar nada além do que está disponível através da interface da classe base.Isso é OO básico.

Outras dicas

Não, você tem um ponteiro para a classe base Info, que, como diz o compilador, não possui um membro chamado someInfo.Esse ponteiro ainda aponta para um SubInfo, mas você não pode acessar membros de classes derivadas por meio de um ponteiro de classe base.

Se você realmente precisar de acesso ao campo, precisará usar dynamic_cast para abatido.Certifique-se de verificar o resultado para garantir que a conversão é válida.

O que está dizendo é verdade

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

Isso não acontece.Você não pode acessar membros filhos de forma polimórfica como está tentando.

Você precisará de uma função de membro virtual na classe Info, como GetSomeInfo() que pode ser puramente virtual ou retornar algo interessante na classe base.Então na classe filha ele pode retornar someInfo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top