Thread View: pl.comp.lang.c
7 messages
7 total messages
Started by Borneq
Mon, 09 May 2016 20:38
Jak wołać konstruktor z konstruktora?
Author: Borneq
Date: Mon, 09 May 2016 20:38
Date: Mon, 09 May 2016 20:38
4 lines
1087 bytes
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?
Author: bartekltg
Date: Mon, 09 May 2016 22:05
Date: Mon, 09 May 2016 22:05
53 lines
2016 bytes
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?
Author: Borneq
Date: Tue, 10 May 2016 06:03
Date: Tue, 10 May 2016 06:03
26 lines
1683 bytes
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?
Author: bartekltg
Date: Tue, 10 May 2016 12:12
Date: Tue, 10 May 2016 12:12
62 lines
2815 bytes
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?
Author: bartekltg
Date: Tue, 10 May 2016 12:16
Date: Tue, 10 May 2016 12:16
67 lines
3114 bytes
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?
Author: slawek
Date: Thu, 12 May 2016 05:09
Date: Thu, 12 May 2016 05:09
8 lines
1361 bytes
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?
Author: M.M.
Date: Fri, 13 May 2016 09:09
Date: Fri, 13 May 2016 09:09
11 lines
1877 bytes
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