C ++: sintaxe para aceder membro estrutura de ponteiro de classe
Pergunta
Estou tentando acessar um membro structs variáveis, mas eu não consigo obter o direito de sintaxe. Os dois erros de compilação de pr. acesso são: erro C2274: 'estilo função de conversão': '' ilegal como lado direito operador C2228 de erro: deixou de '.otherdata' deve ter classe / struct / união Eu tentei várias mudanças, mas nenhum sucesso.
#include <iostream>
using std::cout;
class Foo{
public:
struct Bar{
int otherdata;
};
int somedata;
};
int main(){
Foo foo;
foo.Bar.otherdata = 5;
cout << foo.Bar.otherdata;
return 0;
}
Solução
Você só definir uma struct lá, não alocar um. Tente isto:
class Foo{
public:
struct Bar{
int otherdata;
} mybar;
int somedata;
};
int main(){
Foo foo;
foo.mybar.otherdata = 5;
cout << foo.mybar.otherdata;
return 0;
}
Se você quiser reutilizar o struct em outras classes, você também pode definir o exterior struct:
struct Bar {
int otherdata;
};
class Foo {
public:
Bar mybar;
int somedata;
}
Outras dicas
Bar
é estrutura interna definida dentro Foo
. Criação de objeto Foo
não cria implicitamente os membros da Bar
. Você precisa criar explicitamente o objeto de Bar usando a sintaxe Foo::Bar
.
Foo foo;
Foo::Bar fooBar;
fooBar.otherdata = 5;
cout << fooBar.otherdata;
Caso contrário,
Criar a instância Bar como membro na classe Foo
.
class Foo{
public:
struct Bar{
int otherdata;
};
int somedata;
Bar myBar; //Now, Foo has Bar's instance as member
};
Foo foo;
foo.myBar.otherdata = 5;
Você cria uma estrutura aninhada, mas você nunca criar quaisquer instâncias do mesmo dentro da classe. Você precisa dizer algo como:
class Foo{
public:
struct Bar{
int otherdata;
};
Bar bar;
int somedata;
};
Você pode então dizer:
foo.bar.otherdata = 5;
Você só está declarando Foo :: Bar, mas você não instanciá-lo (não tenho certeza se essa é a terminologia correta)
Veja aqui para uso:
#include <iostream>
using namespace std;
class Foo
{
public:
struct Bar
{
int otherdata;
};
Bar bar;
int somedata;
};
int main(){
Foo::Bar bar;
bar.otherdata = 6;
cout << bar.otherdata << endl;
Foo foo;
//foo.Bar.otherdata = 5;
foo.bar.otherdata = 5;
//cout << foo.Bar.otherdata;
cout << foo.bar.otherdata << endl;
return 0;
}
struct Bar{
int otherdata;
};
Aqui você acabou de definir uma estrutura, mas não criou qualquer objeto dela. Portanto, quando você diz foo.Bar.otherdata = 5;
é erro do compilador. Criar um objeto de struct Bar como Bar m_bar;
e depois usar Foo.m_bar.otherdata = 5;