Konstruktor przypisania (?)

0

Witam,
mam klasę, która posiada jeden konstruktor z jakimś argumentem (nie posiada konstruktora domniemanego).
Przykładowo:

class Klasa
{
   public:
   Klasa(InnaKlasa inna);
}

Teraz mam pytanie: czy da się jakoś zrobić, by wywołać obiekt takiej klasy w ten sposób:

InnaKlasa inna;
Klasa klasa = inna; 

lub tak:

void funkcja(Klasa k);
//wywołanie funkcji:
InnaKlasa inna;
funkcja(inna);
1

Pierwsze wymaga zdefiniowania konstruktora Klasa(InnaKlasa) (z ew. const i &) dla klasy Klasa lub operatora Klasa dla klasy InnaKlasa

Drugie powinno działać tak jak to zrobiłeś.

0

Dzięki. Teraz patrzę na innej klasie to nawet bez operatora przypisania mi działa. Musiałem coś innego skopać, że mi wcześniej nie działało :/

2

Małe sprostowanie. Tutaj :

InnaKlasa inna;
Klasa klasa = inna; 

ruszy do pracy konstruktor konwertujący a nie operator przypisania. Dowód -> http://melpon.org/wandbox/permlink/PtLGoD2qu7gmOwR6
Operator przypisania rusza podczas przypisania (jakby to śmiesznie nie brzmiało) a nie podczas inicjalizacji. Czyli w tym przypadku konstruktor a operator przypisania np w takim przypadku.

InnaKlasa inna;
Klasa klasa;
klasa = inna;
0

Nie zmienia to faktu, że bez operatora przypisania, nie możesz zainicjalizować klasy z użyciem znaku równości.

1

A niby dlaczego to? Inicjalizacja nie ma nic wspólnego z operatorem przypisania (przynajmniej z tego co wiem ;) ). Np tutaj 0 operatora przypisania a inicjalizacja śmiga aż miło -> http://melpon.org/wandbox/permlink/SmXUyHCQq4QFebpf

Edit. Precyzując według niektórych definicji inicjalizacją nazwiemy też późniejsze nadanie wartości więc także przypisanie. Chyba jestem spaczony symfonią Grębosza bo tam inicjalizacja była podczas tworzenia a przypisanie to przypisanie.

1
kq napisał(a):

Nie zmienia to faktu, że bez operatora przypisania, nie możesz zainicjalizować klasy z użyciem znaku równości.

Nie.

Przy tej operacji potrzebny jest konstruktor, który skonwertuje jeden typ na drugi oraz konstruktor kopiujący (przesuwający). Użycie tego ostatniego może zostać usunięte przez kompilator.

(8.5.15, 8.5.17 i okolice w C++14, n3936)

1 użytkowników online, w tym zalogowanych: 0, gości: 1