Enrolado com construtores

15 views
Skip to first unread message

MARCOS UBIRAJARA

unread,
Feb 9, 2012, 1:28:53 PM2/9/12
to ccppb...@googlegroups.com
Pessoal, tou todo enrolado com construtores, vejam o codigo abaixo, onde eu estou errando?
 
Desde já muito grato,
 
 
#include "stdafx.h"
#include <stdlib.h>
#include <string>
#include <iostream>
class A{
 
public:
 
A()
{
 
name="jose";
}
A(int x)
{
//Chama o construtor padrão...
A();
 
//Erro! Imprime nada!!!
std::cout << name << std::endl;
}
 
private:
 
std::string name;
 
};
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
A a(1);
 
 
return 0;
}
 
 
 
 
 
 
Marcos

Fabio Mazzarino

unread,
Feb 9, 2012, 1:43:35 PM2/9/12
to ccppb...@googlegroups.com
Marcos:

Eu testei aqui no xlc e rodou blzinha. Dá uma verificada aí.

#include <iostream>
#include <string>

class A {
        private:
                std::string name;
        public:
                A()
                        { name = "Jose"; }
                A(int n)
                        { A(); std::cout << "TCHAN!\n\n"; }
};

int main() {
        A a(1);
        return 0;
}

# constructor
TCHAN!


Rodrigo Madera

unread,
Feb 9, 2012, 1:44:35 PM2/9/12
to ccppb...@googlegroups.com
Fabio,

Testa agora usando 'name'.

Mx

2012/2/9 Fabio Mazzarino <fabio.m...@gmail.com>


--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en

Fabio Mazzarino

unread,
Feb 9, 2012, 1:48:12 PM2/9/12
to ccppb...@googlegroups.com
Falha minha.

Vc estava reclamando que o construtor não é executado...

Vou fuçar mais um pouco aqui.

Foi mal.

Fabio Mazzarino

unread,
Feb 9, 2012, 1:50:51 PM2/9/12
to ccppb...@googlegroups.com
Agora a resposta certa.

 . Vc não pode chamar construtor a partir de construtor.

Faça uma função chamada init() e faça a inicialização default.

Resolvido.

Rodrigo Madera

unread,
Feb 9, 2012, 1:53:53 PM2/9/12
to ccppb...@googlegroups.com
2012/2/9 Fabio Mazzarino <fabio.m...@gmail.com>

 . Vc não pode chamar construtor a partir de construtor.

Bom garoto! rs.

Marcos,
Tenta usar defaults, eles ajudam muito nisso.

Mx


Ziviani

unread,
Feb 9, 2012, 1:57:16 PM2/9/12
to ccppb...@googlegroups.com
No C++11 isso será possível:

http://en.wikipedia.org/wiki/C%2B%2B11#Object_construction_improvement


class SomeType  {
    int number;
 
public:
    SomeType(int new_number) : number(new_number) {}
    SomeType() : SomeType(42) {}
};

[]s

2012/2/9 Fabio Mazzarino <fabio.m...@gmail.com>

Ivo Calado

unread,
Feb 9, 2012, 2:00:44 PM2/9/12
to ccppb...@googlegroups.com
Pra animar um pouco a discussão. Ao invés de utilizar o método init como apontado, seria possível fazer algo assim (POG puro =):


#include <iostream>
#include <string>

class A {
        private:
                std::string name;
        public:
                A()
                        { name = "Jose"; }
                A(int n)
                {
            *this=A();
            std::cout << name;
        }
};

int main() {
        A a(1);
        return 0;
}

2012/2/9 Ziviani <jrzi...@gmail.com>



--
Ivo Calado


Fabio Mazzarino

unread,
Feb 9, 2012, 2:01:23 PM2/9/12
to ccppb...@googlegroups.com
Foi uma comida de bola fenomenal.

Qdo li a mensagem do Rodrigo foi um facepalm que dava pra ouvir da China.

Esse papo do constutor do C++11 é ótimo. Tem um monte de coisinha que facilita a vida.

Murilo Adriano Vasconcelos

unread,
Feb 9, 2012, 2:01:14 PM2/9/12
to ccppb...@googlegroups.com
Isso acontece porquê ao invés de chamar o construtor como você gostaria, A() na verdade cria um novo objeto como se estivesse em qualquer outra função.

Então isso:
A(int x) { A(); }

É mais ou menos igual a isso:
A(int n) { A temporary_variable(); }

--
Murilo Adriano Vasconcelos

Reuben Morais

unread,
Feb 9, 2012, 2:35:33 PM2/9/12
to ccppb...@googlegroups.com
2012/2/9 Ivo Calado <ivo.c...@ee.ufcg.edu.br>:

> Pra animar um pouco a discussão. Ao invés de utilizar o método init como
> apontado, seria possível fazer algo assim (POG puro =):
>
>
> #include <iostream>
> #include <string>
>
> class A {
>         private:
>                 std::string name;
>         public:
>                 A()
>                         { name = "Jose"; }
>                 A(int n)
>                 {
>             *this=A();
>             std::cout << name;
>         }
> };
>
> int main() {
>         A a(1);
>         return 0;
> }
>

O padrão (não tão famoso) Tipo Gêmeo: só é possível instanciar de dois em dois.

-- reuben

Maicon

unread,
Feb 9, 2012, 5:28:41 PM2/9/12
to ccppbrasil
Buenas Marcos,

o problema é no:


>A(int x)
>{
>//Chama o construtor padrão...
>A();
>*//Erro! Imprime nada!!!*
>* std::cout << name << std::endl;*
>}

Nesse construtor você esta construindo OUTRO objeto da classe A, sem
armazena-lo.

Acredito que o que tu queres é:

A(int x) : A() // Chama o CTOR default
{
*//Erro! Imprime nada!!!*
* std::cout << name << std::endl;*
}


T+

On Feb 9, 4:28 pm, MARCOS UBIRAJARA <marcosubiraj...@ig.com.br> wrote:
> Pessoal, tou todo enrolado com construtores, vejam o codigo abaixo, onde eu
> estou errando?
>
> Desde já muito grato,
>
> #include "stdafx.h"
> #include <stdlib.h>
> #include <string>
> #include <iostream>
> class A{
>
> public:
>
> A()
> {
>
> name="jose";}
>
> A(int x)
> {
> //Chama o construtor padrão...
> A();
>
> *//Erro! Imprime nada!!!*
> * std::cout << name << std::endl;*

P.

unread,
Feb 10, 2012, 7:22:04 AM2/10/12
to ccppb...@googlegroups.com
Em quinta-feira, 9 de fevereiro de 2012 20h28min41s UTC-2, Maicon escreveu:
 
Nesse construtor você esta construindo OUTRO objeto da classe A, sem
armazena-lo.

Acredito que o que tu queres é:

A(int x) : A() // Chama o CTOR default
{
*//Erro! Imprime nada!!!*
* std::cout << name << std::endl;*
}


Atenção, porque isto não é válido em C++98 ou C++03, apenas C++11.

Duvido que algum compilador em produção nesta data suporte a sintaxe acima.

--
 P.

Reuben Morais

unread,
Feb 10, 2012, 7:57:51 AM2/10/12
to ccppb...@googlegroups.com
2012/2/10 P. <pedro....@gmail.com>:

>
> Duvido que algum compilador em produção nesta data suporte a sintaxe acima.
>

Clang 3.1 suporta.

-- reuben

MARCOS UBIRAJARA

unread,
Feb 10, 2012, 8:03:15 AM2/10/12
to ccppb...@googlegroups.com
Eu pensava que era possivel chamar construtor dentro de construtor, igual no java.
 
Mas a dica do init() resolveu perfeitamente, e a pegadinha do contrutor anonimo foi 10!!!
 
 
Muito obrigado mesmo pessoal!
 
MArcos

Maicon

unread,
Feb 10, 2012, 4:44:28 PM2/10/12
to ccppbrasil
@P:

Não, isso não é exclusivo do C++11. Isso é chamado de "initialization
list". Não sei ao certo quando entrou isso no padrão C++,mas não é
exclusivo do patrão C++11.

T+

Felipe Magno de Almeida

unread,
Feb 10, 2012, 5:37:51 PM2/10/12
to ccppb...@googlegroups.com
2012/2/10 Maicon <maico...@gmail.com>:

> @P:
>
> Não, isso não é exclusivo do C++11. Isso é chamado de "initialization
> list". Não sei ao certo quando entrou isso no padrão C++,mas não é
> exclusivo do patrão C++11.

Acredito que o Pedro estava mencionando o uso de delegated constructors.
Ou seja, a chamada de outro construtor (do mesmo tipo) dentro de um
construtor. Isso não existe em C++03. Você só pode chamar os construtores
de subobjects(member objects e bases) dentro da initialization-list em C++03.

> T+
>
> On Feb 10, 10:22 am, "P." <pedro.lama...@gmail.com> wrote:
>> Em quinta-feira, 9 de fevereiro de 2012 20h28min41s UTC-2, Maicon escreveu:
>>
>> > Nesse construtor você esta construindo OUTRO objeto da classe A, sem
>> > armazena-lo.
>>
>> > Acredito que o que tu queres é:
>>
>> > A(int x) : A() // Chama o CTOR default
>> > {
>> > *//Erro! Imprime nada!!!*
>> > * std::cout << name << std::endl;*
>> > }
>>
>> Atenção, porque isto não é válido em C++98 ou C++03, apenas C++11.
>>
>> Duvido que algum compilador em produção nesta data suporte a sintaxe acima.
>>
>> --
>>  P.

--
Felipe Magno de Almeida

Reply all
Reply to author
Forward
0 new messages