|
![]() |
||
Como definir variáveis globais em C++?
|
||
. Nós temos 754.120 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.
![]() |
|
|
Opções do Tópico |
|
|
#1 (permalink) |
|
Veterano
Registrado em: Oct 2002
Localização: Curitiba
Mensagens: 1.437
Reputação: 20
![]() |
Como posso fazer para definir variáveis globais em C++? Estou tentando aqui usando um .h, mas se uma classe altera o valor de uma variável lá, outra classe não pega esse valor novo.
Tipo, a nova classe reinicializa a variável. Talvez porque eu esteja incluindo o .h novamente na outra classs?
__________________
Calma! Não tema! Com Slackware não há problema! ----------------- Slackware 11.0 AMD Athlon64 3000+@1800 OpenGL Programmer Assembler n00b |
|
|
|
|
|
#2 (permalink) |
|
Membro Senior
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0
![]() |
Se não me engano, vc tem que usar o operador :: antes do nome da variável global para modifica-lá ou referir a ela.
Pensando bem, acho que o operador só é necessário quando se tem uma variável global e uma local com o mesmo nome. Mas tente ai, talvez seja isso mesmo. |
|
|
|
|
|
#3 (permalink) |
|
Veterano
Registrado em: Oct 2002
Localização: Curitiba
Mensagens: 1.437
Reputação: 20
![]() |
Compilar compilou, mas dá na mesma que não colocar o operador.
__________________
Calma! Não tema! Com Slackware não há problema! ----------------- Slackware 11.0 AMD Athlon64 3000+@1800 OpenGL Programmer Assembler n00b |
|
|
|
|
|
#4 (permalink) |
|
Veterano
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16
![]() |
Que tal colocar uma declaração extern em um .H (extern int myglobalvar;), declará-la em um CPP (int myglobalvar;), e incluir o .H que contém a declaração extern em todos os .CPP que precisam acessar essa variável?
__________________
Jeferson Charles Mayer "Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?" |
|
|
|
|
|
#5 (permalink) | |
|
Highlander
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Citação:
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns ![]() |
|
|
|
|
|
|
#6 (permalink) |
|
Zumbi
Registrado em: Jan 2004
Mensagens: 5.276
Reputação: 189
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
São duas coisas diferentes: uma coisa é definir a variável, outra é declará-la. Normalmente isso é feito de uma vêz só (definicão e declaracão), mas se for utilizar variáveis globais (que muitos programadores com tendências fortes de OO odeiam), faca como sugeriram o jqueiroz e o jackinabox: defina a variável num arquivo .cpp e declare a como externa onde mais puder ser utilizada.
__________________
------------------------------------------------ Muito bom. Mas tijolo não revida! ------------------------------------------------ |
|
|
|
|
|
#7 (permalink) |
|
Veterano
Registrado em: Oct 2002
Localização: Curitiba
Mensagens: 1.437
Reputação: 20
![]() |
Beleza, vou tentar isso.
__________________
Calma! Não tema! Com Slackware não há problema! ----------------- Slackware 11.0 AMD Athlon64 3000+@1800 OpenGL Programmer Assembler n00b |
|
|
|
|
|
#8 (permalink) |
|
Veterano
Registrado em: Oct 2002
Localização: Curitiba
Mensagens: 1.437
Reputação: 20
![]() |
Essa variável tem que ser um membro direto da classe certo? Por que se eu puser como uma variável de um método, eu tenho esse erro:
In function `engine::engine[not-in-charge]()': : undefined reference to `FPS' FPS é a variável.
__________________
Calma! Não tema! Com Slackware não há problema! ----------------- Slackware 11.0 AMD Athlon64 3000+@1800 OpenGL Programmer Assembler n00b |
|
|
|
|
|
#9 (permalink) |
|
Novo Membro
|
nao entendi direito sua pergunta, mas se sua duvida esta em declarar variaveis globais, ou seja sao declaradas fora de todas as funções, ja variaveis locais sao criadas sempre dentro de funcoes e soh sao visualizadas por meio dakela funcao.
variaveis externas sao compartilhadas por todos os programas fontes que utilizam a linkedicao incluindo seu respectivo arquivo. portanto pode tentar utilizar o que o jackinabox disse. Espero ter ajudado.
__________________
+--------------------------------+ + Um abraço + +--------------------------------+ |
|
|
|
|
|
#10 (permalink) | ||
|
Veterano
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16
![]() |
Citação:
Citação:
Agora não entendi mais...
__________________
Jeferson Charles Mayer "Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?" |
||
|
|
|
|
|
#11 (permalink) |
|
Veterano
Registrado em: Oct 2002
Localização: Curitiba
Mensagens: 1.437
Reputação: 20
![]() |
A variável tem de ser global, mas a sua declaração tem de ser feita no .cpp, na classe, não é mesmo? Essa declaração é feita direto como membro da classe, ou pode ser de dentro de um método da classe?
Assim: globais.h Código:
Código:
__________________
Calma! Não tema! Com Slackware não há problema! ----------------- Slackware 11.0 AMD Athlon64 3000+@1800 OpenGL Programmer Assembler n00b |
|
|
|
|
|
#12 (permalink) | |
|
Veterano
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16
![]() |
Ooops: Editado, pois a inicialização da variável no meu exemplo estava no local errado
ops: Citação:
Se a variável é global, isso significa que ela não será declarada nem como membro da classe, e nem dentro de um método da classe. Variáveis declaradas dentro de um método são variáveis locais, e variáveis declaradas como membros da classe são variáveis membro, e esses termos são excludentes. Não existe algo como "variável global membro" ou "variável global local". Pode haver "várias variantes" relacionadas a onde declarar e onde definir a variável global. Segue um exemplo: globais.h Código:
Código:
__________________
Jeferson Charles Mayer "Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?" |
|
|
|
|
|
|
#13 (permalink) |
|
Highlander
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
talvez ele esteja se confundindo com a visibilidade dos atributos (variáveis membros)... atributos públicos, privados, etc...
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns ![]() |
|
|
|
|
|
#14 (permalink) | |
|
Veterano
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16
![]() |
Citação:
Ei, niTsumuji: Dê uma olhada no meu post anterior, pois fiz uma correção no código!
__________________
Jeferson Charles Mayer "Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?" |
|
|
|
|
|
|
#15 (permalink) | |
|
Veterano
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16
![]() |
Citação:
__________________
Jeferson Charles Mayer "Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?" |
|
|
|
|
|
|
#16 (permalink) |
|
Veterano
Registrado em: Oct 2002
Localização: Curitiba
Mensagens: 1.437
Reputação: 20
![]() |
hum, coloquei pra testar pra valer e veja só:
classe1.cpp Código:
Código:
Código:
Código:
Código:
g++ -c main.cpp g++ -c classe1.cpp g++ -c classe2.cpp g++ main.o classe1.o classe2.o classe2.o(.bss+0x0): multiple definition of `y' classe1.o(.bss+0x0): first defined here collect2: ld returned 1 exit status make: *** [all] Error 1 Se colocar a definição nos .cpp dá esse erro. Se colocar nos .h também. Não tem jeito disso aí funcionar! O que eu quero é simplemente fazer as classes enchergarem a mesma variável.
__________________
Calma! Não tema! Com Slackware não há problema! ----------------- Slackware 11.0 AMD Athlon64 3000+@1800 OpenGL Programmer Assembler n00b |
|
|
|
|
|
#17 (permalink) | |
|
Veterano
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16
![]() |
Citação:
classe2.o(.bss+0x0): multiple definition of `y' classe1.o(.bss+0x0): first defined here Você pode declarar uma variável mais de uma vez, mas somente pode definí-la uma única vez. Você está definindo a variável y 2 vezes, o que é ilegal: classe1.cpp: Código:
Código:
__________________
Jeferson Charles Mayer "Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?" |
|
|
|
|
|
|
#18 (permalink) |
|
Veterano
Registrado em: Oct 2002
Localização: Curitiba
Mensagens: 1.437
Reputação: 20
![]() |
Cara que troço confuso. Quer dizer que eu tenho que definí-la uma única vez em qualquer lugar(achei preferencialmente melhor no main.cpp), e sair usando...
Acho que vou ficar tonto, mas deu certo! Valeu aí pessoal! Essa eu não ia adivinhar nunca!
__________________
Calma! Não tema! Com Slackware não há problema! ----------------- Slackware 11.0 AMD Athlon64 3000+@1800 OpenGL Programmer Assembler n00b |
|
|
|
|
|
#19 (permalink) |
|
Highlander
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Faça +/- assim:
global.h: Código:
Código:
Código:
Código:
Veja tb que eu não declaro "y" em nenhum lugar de classe1.cpp, pois essa declaração vem toda de "global.h".
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns ![]() |
|
|
|
|
|
#20 (permalink) |
|
Veterano
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16
![]() |
A maneira sugerida pelo jqueiroz é uma boa alternativa, pois organiza suas variáveis globais em dois arquivos: a declaração em um .H dedicado para variáveis globais e a definição em um .CPP também dedicado.
Conforme eu havia comentado em post anterior, você pode organizar o acesso a uma variável global de diversas maneiras diferentes. Em um sistema que eu escrevi, por exemplo, a variável global é uma instância de uma classe (e não um int, como no nosso exemplo). Nesse caso, eu optei por uma organização diferente. Como pode ser difícil de entender esse meu exemplo real, vou dar um exemplo fake correspondente: Digamos que você tenha um sistema com 200 classes. Existe apenas uma instância de uma dessas classes, e essa instância deve ser acessada por várias outras classes. Então uma opção seria declarar essa instância como uma variável global (uugghh, dê-lhe acoplamento - don't try this at home). Vamos considerar que essa classe seja a classe Scanner (um desses scanners de supermercado, que serve para ler o código de barras dos produtos). class Scanner.h: Código:
Código:
Código:
Código:
Tentando resumir: - Coloque a declaração extern em um lugar onde as outras classes interessadas possam incluir essa declaração (o que permitirá que o compilador identifique o tipo da variável em todos os pontos em que ela for referenciada). - Defina a variável apenas em um dos módulos do conjunto de arquivos (o que permitirá que o linker resolva as referências àquela variável).
__________________
Jeferson Charles Mayer "Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?" |
|
|
|
![]() |
| Opções do Tópico | |
|
|