Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss
Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Różne nazwy konstruktora?

53 views
Skip to first unread message

Borneq

unread,
Dec 7, 2020, 2:05:03 PM12/7/20
to
W starym Pascalu choćby konstruktor może mieć różne nazwy. W C++ może
być wiele konstruktorów różniących się parametrami.
Jednak czasem potrzeba by były różne nazwy.
Taki przykład:
Liczba zespolona, ma pola Re i Im. Inicjuje się tymi dwiema liczbami, a
chciałbym jeszcze inicjować przez promień i kąt.
Co warto zrobić?

Maciek Godek

unread,
Dec 7, 2020, 3:04:32 PM12/7/20
to
Ponieważ kąt nie jest "normalną" liczbą, a liczbą z określonego przedziału (powiedzmy, od 0 do 2pi), to można stworzyć osobną klasę Angle, i kontruktor przeciążony dla obiektu tej klasy.
Można też stworzyć metodę statyczną zwracającą instancje klasy.

Choć przyznam szczerze, że gdybym chciał korzystać z liczb zespolonych w C++, to bym użył std::complex.
(I generalnie, jak bym chciał rozwiązać jakiś problem, to bym zaczął od poszukania gotowca)

Wojciech Muła

unread,
Dec 7, 2020, 3:10:09 PM12/7/20
to
1. Statyczna metoda

class Complex {
public:
Complex(double re, double im);
static Complex from_polar(duoble mod, double arg);
}

2. Specjalizacja z własnym typem

struct UsePolarCoordsPlease {};

UsePolarCoordsPlease from_polar;

class Complex {
public:
Complex(double re, double im);
Complex(double mod, double arg, UsePolarCoordsPlease);
};

Complex a{1, 2};
Complex b{5, 12, from_polar};

3. Wprowadzić osobny typ do przechowywania kątów, który nie jest domyślnie
konwertowalny na liczbę i wtedy robisz specjalizacje dla niego. Ale to już
zdecydowanie najwięcej zabawy.

w.

heby

unread,
Dec 7, 2020, 4:19:17 PM12/7/20
to
On 07/12/2020 20:04, Borneq wrote:
> Co warto zrobić?

Fabrykę.

Ghost

unread,
Dec 8, 2020, 12:42:29 PM12/8/20
to


Użytkownik "heby" napisał w wiadomości grup
dyskusyjnych:rqm68j$cls$1...@dont-email.me...

On 07/12/2020 20:04, Borneq wrote:
>> Co warto zrobić?

>Fabrykę.

Do tego trzeba trzech gosci, z ktorych zaden nie ma nic.

M.M.

unread,
Dec 22, 2020, 9:22:35 PM12/22/20
to
Trochę inne zagadnienie związane z konstruktorami, które zawsze mnie denerwowało w C++.
Poniższy kod w C++ się nie skompiluje:

class A {
int a;
public:
A(const int a):a(a) {
}
};
class B : public A {
};
int main()
{
B b(3);
return 0;
}

Natomiast odpowiedni kod w PHP działa bez zarzutu. Co by było złego, gdyby w C++
konstruktory 'były dziedziczone' ?

Pozdrawiam

M.M.

unread,
Dec 22, 2020, 9:22:38 PM12/22/20
to
Słyszałem, że w HP wystarczyło dwóch.
Pozdrawiam

Wojciech Muła

unread,
Dec 23, 2020, 10:22:30 AM12/23/20
to
On Wednesday, December 23, 2020 at 3:22:35 AM UTC+1, M.M. wrote:
> Trochę inne zagadnienie związane z konstruktorami, które zawsze mnie denerwowało w C++.
> Poniższy kod w C++ się nie skompiluje:
>
> class A {
> int a;
> public:
> A(const int a):a(a) {
> }
> };
> class B : public A {
> };
> int main()
> {
> B b(3);
> return 0;
> }
>
> Natomiast odpowiedni kod w PHP działa bez zarzutu. Co by było złego, gdyby w C++
> konstruktory 'były dziedziczone' ?

Od C++11:

class B: public A {
using A::A;
};

Więcej na https://en.cppreference.com/w/cpp/language/using_declaration

w.

M.M.

unread,
Dec 23, 2020, 11:04:20 AM12/23/20
to
Faktycznie.

Pozdrawiam.

Przemek Biernat

unread,
Mar 29, 2023, 1:27:56 PM3/29/23
to
Nie rozumiem dlaczego ciebie to denerwuje. Normalne zachowanie w C++.
0 new messages