Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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