class Outer {
class Inner {
public:
Inner() {}
void func() ;
};
private:
static const char* const MYCONST;
int var;
};
void Outer::Inner::func() {
var = 1;
}
const char* const Outer::MYCONST = "myconst";
Este erro ocorre quando eu compilo com a classe Outer :: Inner 'não tem nenhum membro chamado' var '
c++
inner-classes
Kal
fonte
fonte
Uma classe interna tem acesso a todos os membros da classe externa, mas não tem uma referência implícita a uma instância de classe pai (ao contrário de algumas estranhezas com Java). Portanto, se você passar uma referência à classe externa para a classe interna, ela poderá fazer referência a qualquer coisa na instância da classe externa.
fonte
Qualquer coisa que faça parte da Outer deve ter acesso a todos os membros da Outer, públicos ou privados.
Editar: seu compilador está correto, var não é membro do Inner. Mas se você tiver uma referência ou ponteiro para uma instância de Outer, ele poderá acessá-la.
fonte
var não é membro da classe interna.
Para acessar var, um ponteiro ou referência a uma instância de classe externa deve ser usado. por exemplo, pOuter-> var funcionará se a classe interna for amiga da externa, ou var for pública, se seguirmos estritamente o padrão C ++.
Alguns compiladores tratam as classes internas como amigas das externas, mas outros não. Consulte este documento para compilador IBM :
"Uma classe aninhada é declarada dentro do escopo de outra classe. O nome de uma classe aninhada é local para sua classe envolvente. A menos que você use ponteiros explícitos, referências ou nomes de objeto, as declarações em uma classe aninhada só podem usar construções visíveis, incluindo nomes de tipo, membros estáticos e enumeradores da classe envolvente e variáveis globais.
As funções de membro de uma classe aninhada seguem regras de acesso regulares e não têm privilégios de acesso especiais para membros de suas classes incluídas. As funções de membro da classe envolvente não têm acesso especial aos membros de uma classe aninhada. "
fonte
friend
oupublic
. Quem se importa se a IBM estava errada / desatualizada, no passado, em um link morto? Esta resposta já estava desatualizada 3 anos antes de ser postada.Em primeiro lugar, você está tentando acessar um membro não estático
var
fora da classe, o que não é permitido em C ++.A resposta de Mark está correta.
Portanto, você pode fazer duas coisas, declarar
var
comostatic
ou usar uma referência de uma instância da classe externa para acessar 'var' (porque uma classe ou função amiga também precisa de referência para acessar dados privados).Var estática
Mude
var
parastatic
Se você não quiservar
ser associado às instâncias da classe.Saída- var: 1
Var não estático
A referência de um objeto deve acessar quaisquer variáveis de membro não estáticas.
Saída- var: 1
Editar - Links externos são links para meu blog.
fonte