Duvida sobre ponteiros dentro de classes

1. Duvida sobre ponteiros dentro de classes

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/01/2014 - 22:06h

Quando eu compilo o meu programa que contem um trecho com o seguinte código:

5 class char_pointers
6 {
7 public:
8 char comandoch;
9 char *ps;
10 char *comando=new char;
11 char_pointers();
12 ~char_pointers();
13
14 }t0;

15 char_pointers::char_pointers()
16 {
17 ps=&comandoch;
18 }
19 char_pointers::~char_pointers()
20 {
21 delete comando;
22 }

Eu recebo o seguinte aviso:

||=== projeto2, Debug ===|
/home/thiago/Documentos/projeto2/main.cpp|10|warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]|
||=== Build finished: 0 errors, 1 warnings ===|

o que significa isso e o que eu posso alterar no código para satisfazer esse aviso?

Mas mesmo assim meu programa não apresentou funcionamento inesperado enquanto a esse trecho.





  


2. Re: Duvida sobre ponteiros dentro de classes

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 24/01/2014 - 08:47h

A mensagem do compilador avisa sobre uma inicialização de um membro da classe, no caso, char * comando.

Isso só foi adicionado no C++11, tens duas opções, ou adiciona a linha do gcc -std=c++11 ou retira o "new char;" e acrescenta dentro do construtor:


char_pointers::char_pointers()
{
ps= &comandoch;
comando=new char;
}


Também não esqueça de desalocar esse ponteiro, uma vez que tenha usado new ele ficará no heap.



char_pointers::~char_pointers()
{
delete comando;
}


Leia sobre smart_ptr<T>, unique_ptr<T> e shared_ptr<T>, ele ajudam a evitar memory leaks.


3. Re: Duvida sobre ponteiros dentro de classes

Pedro Henrique Rissato
pedrorissato

(usa Fedora)

Enviado em 24/01/2014 - 08:58h

Vamos tentar ajudar! xD

Não sei qual o seu nível de programação, mas ainda que seja alto, algumas referentes valem a pena. xD

Em relação ao C/C++ existiram diversas revisões da linguagem durante os anos, alterando sintaxes, incluindo melhorias, etc... As principais revisões foram C89 (ou conhecida também como C90), C99 e a "mais recente" C11... basicamente fazem referente aos anos de "reconhecimento" e implementação das revisões, 1989, 1999 e 2011....

Sabendo disto, o compilador pode receber como parâmetro na compilação, com qual revisão da linguagem C você gostaria de compilar aquele fonte.

Neste caso basta adicionar ao gcc na hora da compilação, o parâmetro:

-std=c++11 ou -std=gnu++11

http://gcc.gnu.org/gcc-4.8/cxx0x_status.html

No site acima, você checa as implementações da revisão C11.

Lembrando que a implementação dependerá, logicamente, da versão do GCC que está rodando. Para C11 é necessário no mínimo GCC 4.8
Lembrete! Alterando a revisão, pode ser necessário alterar a sintaxe da função, já a sintaxe padrão também pode ter sido alterada.

No link abaixo, você encontra mais sobre membros não-estáticos:
http://en.cppreference.com/w/cpp/language/data_members

Pelo que vi na revisão C11, foi implementado o suporte a membros não estáticos de uma classe, o que faz com que o C/C++ possam trabalhar melhor com a realocação de memória das variáveis dentro de classes.

Espero ter contribuído com algo! Teste ambas as hipóteses, sem o parâmetro da revisão e com o parâmetro C11 e veja quais as diferenciações. xD


4. Re: Duvida sobre ponteiros dentro de classes

Pedro Henrique Rissato
pedrorissato

(usa Fedora)

Enviado em 24/01/2014 - 09:02h

(double post)

Uma documentação muito legal:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

Explica tudo sobre a inicialização de membros não-estáticos dentro das classes, o porque da sua implementação no C e até os problemas que podem ser gerados xD


5. Re: Duvida sobre ponteiros dentro de classes

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/01/2014 - 14:27h

Eu preferi trocar o (char *comando=new char) por (string comando) então deixei desse jeito:

class char_pointers
{
public:
char comandoch;
char *ps;
string comando;
char_pointers();
~char_pointers();

} t0;

char_pointers::char_pointers()
{
cout<<"\nChamando construtor!"<<endl;
ps=&comandoch;
}
char_pointers::~char_pointers()
{
cout<<"\nChamando destrutor!"<<endl;

}

É mais viavel utilisar o objeto da classe string em vez do ponteiro apontado para um "new char" ?
Qual seria suas (des)vantagens? Eu ainda sou meio iniciante na programação!


6. Re: Duvida sobre ponteiros dentro de classes

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/01/2014 - 15:42h

Qual revisão do c++ o gnu compiler collection usa como padrão?No aviso,ele diz que essas opções estão ativadas por padrão.A minha versão do gcc é 4.7.2 .






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts