🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

7 total messages Started by Borneq Mon, 09 May 2016 20:38
Jak wołać konstruktor z konstruktora?
#308535
Author: Borneq
Date: Mon, 09 May 2016 20:38
4 lines
1087 bytes
Mam dwa konstruktory, jeden ma parametry (a,b,c), drugi tylko (a) i woła 
ten pierwszy wypełniając najpierw b i c a następnie wołając.
Nie mogę napisać nazwę klasy.
Chodzi mi o konstruktory tej samej klasy. A wołanie z nadklasy? base? super?
Re: Jak wołać konstruktor z konstruktora?
#308536
Author: bartekltg
Date: Mon, 09 May 2016 22:05
53 lines
2016 bytes
On 09.05.2016 22:38, Borneq wrote:

Przeczytałeś ten post przed wysłaniem?
Nie. Bo jest on logicznie niespójny a zdania mają dziury!
Jeśli zdawałeś inne pytanie niż dostałeś odpowiedź, pretensje możesz
mieć tylko do siebie ;-)

> Mam dwa konstruktory, jeden ma parametry (a,b,c), drugi tylko (a) i woła
> ten pierwszy wypełniając najpierw b i c a następnie wołając.

Jak wypełnia b i c?
Szklana kula: równa a.

Wołając co?
Szklana kula: konstruktor trójargumentowy.



"delegating constructors", od c++11
https://en.wikipedia.org/wiki/C%2B%2B11#Object_construction_improvement


class fu
{public:
     int a,b,c;
     fu(int A): fu(A,A,A) {};
     fu(int A, int B, int C): a(A), b(B),c(C) {};
};

int main()
{
     fu bar(16);
     cout<<bar.a<<bar.b<<bar.b<<endl;
}

Mniej elegancko, ale możę ideal będzie czytalniejsza:

class fu
{public:
     int a,b,c;
     fu(int A, int B, int C)
     {
         a=A;
         b=B;
         c=C;
     };
     fu(int A): fu(A,A,A) {};
};

Z klasą bazową robisz tak samo, dwukropkiem. Od zawsze.

pzdr
bartekltg
Re: Jak wołać konstruktor z konstruktora?
#308526
Author: Borneq
Date: Tue, 10 May 2016 06:03
26 lines
1683 bytes
W dniu 10.05.2016 o 00:05, bartekltg pisze:
>     fu(int A, int B, int C)
>     {
>         a=A;
>         b=B;
>         c=C;
>     };
>     fu(int A): fu(A,A,A) {};

A co gdy mamy najpierw wyliczać argumenty a dopiero POTEM podać do 
konstruktora?

fu(istream stream, int size, int position)
{
   wczytywanie ze strumienia stream od pozycji position, do bufora,
   którego rozmiar jest nie większy niż size-position
}

fu(istream stream)
{
   wyliczanie pozycji za pomocą tellg()
   ustawienie się na końcu za pomocą stream.seekg(0, ios::end);
   wyliczenie rozmiaru za pomocę tellg()
   ustawienie się w poprzedniej pozycji: stream.seekg(position,ios::beg);
   dopiero teraz mamy wołać konstruktor trójargumentowy
}
Re: Jak wołać konstruktor z konstruktora?
#308544
Author: bartekltg
Date: Tue, 10 May 2016 12:12
62 lines
2815 bytes
On 10.05.2016 08:03, Borneq wrote:
> W dniu 10.05.2016 o 00:05, bartekltg pisze:
>>     fu(int A, int B, int C)
>>     {
>>         a=A;
>>         b=B;
>>         c=C;
>>     };
>>     fu(int A): fu(A,A,A) {};
>
> A co gdy mamy najpierw wyliczać argumenty a dopiero POTEM podać do
> konstruktora?
>
> fu(istream stream, int size, int position)
> {
>    wczytywanie ze strumienia stream od pozycji position, do bufora,
>    którego rozmiar jest nie większy niż size-position
> }
>
> fu(istream stream)
> {
>    wyliczanie pozycji za pomocą tellg()
>    ustawienie się na końcu za pomocą stream.seekg(0, ios::end);
>    wyliczenie rozmiaru za pomocę tellg()
>    ustawienie się w poprzedniej pozycji: stream.seekg(position,ios::beg);
>    dopiero teraz mamy wołać konstruktor trójargumentowy
> }

W takim wypadku powtarzające się mięsko wsadziłbym w inną prywatną 
funkcję i wołał ją z obu konstruktorów.

void init (int A, int B, int C)
   {
	a=A;
	b=B;
	c=C;
    };

      fu(int A, int B, int C)
      {
		init (A,B,C)
      };
     fu(bla s)
     {
	//magia na s
	init (A,B,C)
      }

Dlaczego nie bardzo można wołać konsturktor z konstruktora...
Konstruktor to nie zwykła funkcja, bo zanim wejdziesz
w jej ciało odpala ona konstruktory pol składowych.
Jeśli więc odpalilibyśmy konstruktor wewnetrz ciałą
konstruktora, to albo skłądowe byłyby inicjalizowane
rez jeszcze (bez sensu) albo kompilator by je pomijał,
co, niezależnie od tego, czy pominąłby je z wewnętrznego czy
zewnetrznego konstruktora, mogło by doprowadzić do odstrzelenia
sobioe palca (ciało pierwszego konstuktora wymaga jakiejś, choćby
domyślnej inicjalizacji obiektu skłądowego, a wołany dalej
konstruktor inicjalizuje ten obiekt zmienną:) ).

pzdr
bartekltg
Re: Jak wołać konstruktor z konstruktora?
#308545
Author: bartekltg
Date: Tue, 10 May 2016 12:16
67 lines
3114 bytes
On 10.05.2016 14:12, bartekltg wrote:
> On 10.05.2016 08:03, Borneq wrote:
>> W dniu 10.05.2016 o 00:05, bartekltg pisze:
>>>     fu(int A, int B, int C)
>>>     {
>>>         a=A;
>>>         b=B;
>>>         c=C;
>>>     };
>>>     fu(int A): fu(A,A,A) {};
>>
>> A co gdy mamy najpierw wyliczać argumenty a dopiero POTEM podać do
>> konstruktora?
>>
>> fu(istream stream, int size, int position)
>> {
>>    wczytywanie ze strumienia stream od pozycji position, do bufora,
>>    którego rozmiar jest nie większy niż size-position
>> }
>>
>> fu(istream stream)
>> {
>>    wyliczanie pozycji za pomocą tellg()
>>    ustawienie się na końcu za pomocą stream.seekg(0, ios::end);
>>    wyliczenie rozmiaru za pomocę tellg()
>>    ustawienie się w poprzedniej pozycji: stream.seekg(position,ios::beg);
>>    dopiero teraz mamy wołać konstruktor trójargumentowy
>> }
>
> W takim wypadku powtarzające się mięsko wsadziłbym w inną prywatną
> funkcję i wołał ją z obu konstruktorów.
>
> void init (int A, int B, int C)
>    {
>      a=A;
>      b=B;
>      c=C;
>     };
>
>       fu(int A, int B, int C)
>       {
>          init (A,B,C)
>       };
>      fu(bla s)
>      {
>      //magia na s
>      init (A,B,C)
>       }
>
> Dlaczego nie bardzo można wołać konsturktor z konstruktora...
> Konstruktor to nie zwykła funkcja, bo zanim wejdziesz
> w jej ciało odpala ona konstruktory pol składowych.
> Jeśli więc odpalilibyśmy konstruktor wewnetrz ciałą
> konstruktora, to albo skłądowe byłyby inicjalizowane
> rez jeszcze (bez sensu) albo kompilator by je pomijał,
> co, niezależnie od tego, czy pominąłby je z wewnętrznego czy
> zewnetrznego konstruktora, mogło by doprowadzić do odstrzelenia
> sobioe palca (ciało pierwszego konstuktora wymaga jakiejś, choćby
> domyślnej inicjalizacji obiektu skłądowego, a wołany dalej
> konstruktor inicjalizuje ten obiekt zmienną:) ).

I dodatkowo, co tak naprawdę robi konstruktor wywołany w funkcji:
https://isocpp.org/wiki/faq/ctors#init-methods

pzdr
bartekltg
>
Re: Jak wołać konstruktor z konstruktora?
#308546
Author: slawek
Date: Thu, 12 May 2016 05:09
8 lines
1361 bytes
On Tue, 10 May 2016 14:12:13 +0200, bartekltg <bartekltg@gmail.com> 
wrote:
> W takim wypadku powtarzające się mięsko wsadziłbym w inną prywatną 
> funkcję i wołał ją z obu konstruktorów.

Fe. Lepiej zauważyć że potrzeba więcej obiektów i więcej 
konstruktorów. Ewentualnie zastanowić się nad 
fabryką/budowniczym/etc.
Re: Jak wołać konstruktor z konstruktora?
#308547
Author: M.M.
Date: Fri, 13 May 2016 09:09
11 lines
1877 bytes
On Thursday, May 12, 2016 at 7:09:34 AM UTC+2, slawek wrote:
> On Tue, 10 May 2016 14:12:13 +0200, bartekltg <bartekltg@gmail.com> 
> wrote:
> > W takim wypadku powtarzające się mięsko wsadziłbym w inną prywatną 
> > funkcję i wołał ją z obu konstruktorów.
> 
> Fe. Lepiej zauważyć że potrzeba więcej obiektów i więcej 
> konstruktorów. Ewentualnie zastanowić się nad 
> fabryką/budowniczym/etc.

Oba podejścia mogą być dobre.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads