Dwa konstruktory konwertujące w jednej klasie

0
#include <iostream>
#include <cstring>
using namespace std;

class zespolona
{
    double rzeczyw;
    double urojon;
    string nazwa;
public:
    zespolona(double r)
    {
        rzeczyw = r;
        urojon = 0;
    }
    zespolona(string nn)
    {
        rzeczyw = 2;
        urojon = 0;
        nazwa = nn;
    }
    zespolona(double r, double i,string nn = "aa") : rzeczyw(r), urojon(i), nazwa(nn)
    {

    }
    friend zespolona dodaj(zespolona a, zespolona b,zespolona c);
    void wypisz()
    {
        cout << rzeczyw << ", " << urojon << " : " << nazwa << endl;
    }
};
zespolona dodaj(zespolona a, zespolona b,zespolona c)
{
    zespolona suma(0,0,"");
    suma.rzeczyw = a.rzeczyw + b.rzeczyw + c.rzeczyw;
    suma.urojon = a.urojon + b.urojon + c.urojon;
    suma.nazwa = c.nazwa;
    return suma;
}

int main()
{
    zespolona k(0,0,"");
    k = dodaj(3.8,4,"ostatni");
    k.wypisz();

    return 0;
}
 

Występuję błąd przy linijce

k = dodaj(3.8,4,"ostatni");

. Chodzi o to, że w konstruktorze z trzema argumentami, argument typu string występuje jako trzeci i dlatego jest błąd przy kompilacji ?

1

Błąd jest dlatego ze metoda dodaj przyjmuje obiekty klasy, a nie double i stringa.

0

Żeby nie te zmienne string to by wszystko działało, a chcę żeby ze stringami działało. Bo chciałem spróbować coś napisać na konstruktorach konwertujących.

3

Chodzi o to, że "ostatnia" to nie jest std::string, tylko const char*. Oczywiście to może być niejawnie konwertowane na std::string.
Problem polega na tym, że funkcja dodaj() przyjmuje zespolona, więc potrzebne są 2 konwersje: const char* -> std::string -> zespolona. Każda z tych konwersji jest znana, ale istnieje reguła w C++, która mówi, że kompilator nie robi ciągu niejawnych konwersji typów użytkownika (robi tylko jedną konwersję).

Żeby ten kod działał, musisz podać mu od razu std::string, np. w ten sposób:

k = dodaj(3.8, 4, std::string("ostatni"));
2

Sprawę wyjaśnił @twonek. Ja od siebie dodam, że alternatywnym rozwiązaniem jest dodanie konstruktora:

zespolona(const char *nn = "aa")
{
    rzeczyw = 2;
    urojon = 0;
    nazwa = nn;
}

Napisany analogicznie do tego, który zrobiłeś dla string.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.