Kilka operatorów C++

0

Mam problem z takim zadankiem.
Pojawia się błąd: "error: no match for call to '(Pierwsza) (Pierwsza)' "
Załączam kod:

#include <iostream>


class Pierwsza
{
public:
	Pierwsza(){};
	~Pierwsza(){};
	Pierwsza(const int liczba1): liczba(liczba1){};

	Pierwsza operator+(const Pierwsza &obj)
	{
		return Pierwsza(liczba+obj.liczba);
	};

	operator int()
	{
		return liczba;
	};

private:
	int liczba;


};


int main()
{
	Pierwsza a(1);
	Pierwsza b(2);

//Poniższy przykład nie działa
	Pierwsza c;
	int suma = c(a+b);
	std::cout << suma << std::endl;

//Poniższy przykład działa
	Pierwsza d = a+b;
        int suma1 = d;
        std::cout << suma1 << std::endl;

	return 0;
}

 
1

Operator + zwraca ci obiekt i gdy ten obiekt od razu przypisujesz do innego, nowotworzonego obiektu chce zostać wywołany konstruktor kopiujący.

Czyli tu Pierwsza d = a + b;
Zostanie wywołany konstruktor
Pierwsza( const Pierwsza &);

Ale musisz go najpierw zdefiniować

0

Tak zdefiniowałem konstruktor kopiujący

	Pierwsza(const Pierwsza &obj)
	{
		liczba = obj.liczba;
	};
 

Nadal ten sam błąd.
Wcześniej próbowałem z tym konstruktorem kopiującym, z racji tego ze to nic nie dawało. Postanowiłem tego konstruktora tutaj(na forum) w kodzie nie umieszczać.

1

Albo:

    Pierwsza c(a+b);
    int suma=c;

Albo: dodaj:

    Pierwsza operator()(int liczba)
    {
        this->liczba=liczba;
        return *this;
    }

Znajdź wszystkie różnice ze swoim kodem, i jak nie rozumiesz czemu, to pytaj:

class Pierwsza
  {
   public:
   //~Pierwsza() {} // - tego akurat nie musisz robić samo się zrobi
   Pierwsza():liczba(0) {}
   Pierwsza(int liczba):liczba(liczba) {}
   // Pierwsza(const Pierwsza &obj):liczba(obj.liczba) {} // - tego akurat nie musisz robić samo się zrobi
   Pierwsza operator+(const Pierwsza &obj)const { return Pierwsza(liczba+obj.liczba); } 
   operator int() { return liczba;  }; 
   private:
   int liczba; 
  };
0

Czemu ja na to nie wpadłem, przecież mam obiekt klasy Pierwsza i nawiasy...
Ja sobie to zapisałem jako:

	Pierwsza operator()(const Pierwsza &obj)
	{
		this->liczba = obj.liczba;
		return *this;
	};

 

I również działa.
Dziękuję za zainteresowanie tematem i pomoc ! :)

2

@jakubs

#include <iostream>
using namespace std;

class Pierwsza
  {
   public:
   Pierwsza():liczba(0) {}
   Pierwsza(int liczba):liczba(liczba) {}
   Pierwsza operator()(const Pierwsza &obj)
     {
      liczba=obj.liczba;
      return *this; 
     }
   Pierwsza operator+(const Pierwsza &obj)const { return Pierwsza(liczba+obj.liczba); } 
   operator int() { return liczba;  }; 
   private:
   int liczba; 
  };
  
class Druga
  {
   public:
   Druga():liczba(0) {}
   Druga(int liczba):liczba(liczba) {}
   Druga operator()(int liczba)
     {
      this->liczba=liczba;
      return *this; 
     }
   Druga operator+(const Druga &obj)const { return Druga(liczba+obj.liczba); } 
   operator int() { return liczba; }; 
   private:
   int liczba; 
  };
  
int main()
  {
   Pierwsza p;
   Druga d;
   d(p); // ok
   //p(d); // niestety
   return 0;
  }

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