R-Referencja, uzycie dla typów prostych

0

Chce stworzyć kod, który bedzie wykorzystywał R-Referencje, ale nie do konca wiem jak to zrobic. Przyklady, które znalazłem w internecie są zazwyczaj dla typów złozonych, a ich działanie polega zazwyczaj na przestawieniu wskaznika.
Jak mogę zrobić to dla typów prostych?

Chetnię przyjmę pomoc w postacie materiałów do przestudiowania ;)

 #include <string>
#include <iostream>
using namespace std;
class Book {
	std::string autor, tytul;
public:
	Book()
	{
		autor = "nieznany";
		tytul = "nieznany";
	}
	Book(string&t, string &a)
	{
		autor = a;
		tytul = t;
	}
	Book(string &&t, string &&a)
	{
		//Jak powinien wygladac taki konstruktor?
	}
	void wypisz()
	{
		cout << autor << endl << tytul << endl;
	}
};



int main()
{

    return 0;
}


3

autor = std::move(a); tytul = std::move(t);
A właściwie to initializer list powinieneś użyć.

0

Nie czuje sie na razie w tym, moglby ktos sprawdzic, czy wszystko tutaj ok?

#include <string>
#include <iostream>
using namespace std;
class Book {
	std::string autor, tytul;
public:
	Book()
	{
		autor = "nieznany";
		tytul = "nieznany";
	}
	Book(string&t, string &a)
	{
		autor = a;
		tytul = t;
	}
	Book(string &&t, string &&a)
	{
		autor = move(a);
		tytul = move(t);
	}
	void wypisz()
	{
		cout << autor << endl << tytul << endl;
	}
	string GetA()
	{
		return autor;
	}
	string GetT()
	{
		return tytul;
	}
	void SetA(string &&a)
	{
		autor = move(a);
	}
	void SetT(string &&t)
	{
		tytul= move(t);
	}
	void SetA(string &a)
	{
		autor = a;
	}
	void SetT(string &t)
	{
		tytul = t;
	}
	Book(const Book &copy)
	{
		autor = copy.autor;
		tytul = copy.tytul;
	}
	Book(Book &&copy)
	{
		autor = move(copy.autor);
		tytul = move(copy.tytul);
		//tutaj powinienem jakos wyzerowac obiekt copy?
	}
	Book& operator=(const Book& right)
	{
		Book tmp = right;
		swap(autor, tmp.autor);
		swap(tytul, tmp.tytul);
		return *this;
	}

	Book& operator=(const Book&& right)
	{
		autor = move(right.autor);
		tytul = move(right.tytul);
		return *this;
	}

};



int main()
{
	Book k("krzysiek", "ksiazka");
	k.wypisz();
    return 0;
}

 
1
     Book(Book &&copy)
    {
        autor = move(copy.autor);
        tytul = move(copy.tytul);
        //tutaj powinienem jakos wyzerowac obiekt copy?
    }

Przy takiej implementacji rozjedzie Ci się Book a; a = move(a);. Zobacz sobie. Rozwiązania masz dwa:

  1. if (&copy == this) return;
  2. copy-and-swap idiom do poczytania tutaj - https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom

Ponadto dalej nie używasz initializer list.

1

EDIT @up

Chodziło oczywiście o Book& operator=(const Book&& right).
Jeszcze dwie rzeczy: const Book & zamiast Book &. A const Book && jest prawie zawsze bez sensu.

0

Chodzi o coś takiego?

Book(string&t, string &a) : autor(a), tytul(a)
	{
		;
	}
 

Teraz wygląda okey?

Book& operator=(Book&& right)
	{
		if (&right == this) return *this;
		autor = move(right.autor);
		tytul = move(right.tytul);
		return *this;
	}
 

Dzięki bardzo za pomoc.

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