اجرای تابع عضو کلاس بدون کپی کردن - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

اجرای تابع عضو کلاس بدون کپی کردن

+1 امتیاز

من یک کلاس دارم به این شکل 

class A{
public:
	A(std::initializer_list<int> data) :data_(data){}
	A(std::vector<int> data) :data_(data){}
	A sort(){
		A cpy(*this);  // make a copy
		std::sort(cpy.data_.begin(), cpy.data_.end()); // sort the copy
		return cpy;
	}
	void print(){
		for (auto i : data_){
			std::cout << i << '\n';
		}
	}
private:
	std::vector<int> data_;
};

 

مشکلی که دارم اینه که وقتی به این شکل ازش استفاده می کنم :

std::vector<int> factory(){
	std::vector<int> a = { 1, 2, 3 };
	//do some operations
	//return huge vector!
	return a;
}
int main()
{
	A(factory()).sort().print();
}

یکبار تابع factory مقدار بازگشتیش کپی میشه داخل A یکبار داخل sort کپی انجام میشه من میخوام بدون کپی این کار انجام بشه 

بعد از خوندن این تاپیک  متوجه شدم برای مورد اول باید move constructor نوشت ولی مورد دوم رو نفهمیدم چکار باید بکنم ؟

سوال شده شهریور 8, 1393  بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
ویرایش شده شهریور 8, 1393 بوسیله ی farnoosh

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

همون طور که خودتون هم گفتید برای کپی نشدن مورد اول باید move constructor نوشت

برای مورد دوم باید ۲ تا overload برای تابع sort بنویسید :

A sort()const& ;
A sort()&&;

مورد دوم برای زمان هایی که متغیر موقت میفرستین استفاده میشه مثل مثالی که شما زدید 

پس در مجموع باید به شکل زیر بنویسید  : (اجرا در ideone )

#include <iostream>
#include <vector>
#include <algorithm>

class A
{
public:
	A(std::initializer_list<int> data) :data_(data){}

	A(const std::vector<int>& data) :data_(data){}

	A(std::vector<int>&& data) :data_(std::move(data)){};

	A sort()const& 
	{
		A cpy(*this);  // make a copy
		std::sort(cpy.data_.begin(), cpy.data_.end()); // sort the copy
		return cpy;
	}

	A sort()&&
	{
		std::sort(data_.begin(), data_.end());
		return *this;
	}

	void print()
	{
		for (auto i : data_){
			std::cout << i << '\n';
		}
	}

private:
	std::vector<int> data_;
};

std::vector<int> factory()
{
	std::vector<int> a = {5,3,4, 1, 2, 3 };
	//do some operations
	//return huge vector!
	return a;
}
int main()
{
	A(factory()).sort().print();
}

 

پاسخ داده شده شهریور 8, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده دی 15, 1393 بوسیله ی BlueBlade
...