Unique_ptr error

Hi I am currently using unique ptr for my vector and i keep hitting errors when i push_back an object.

[Error] use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = ShapeTwoD; _Dp = std::default_delete<ShapeTwoD>]'

ShapeTwoD.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#ifndef SHAPETWOD_H
#define SHAPETWOD_H
#include <string>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <utility>
#include <memory>

using namespace std; 

class ShapeTwoD {
	protected:
	string name;
	bool containsWarpspace;
	
	vector<unique_ptr<ShapeTwoD>>shape;	
	
			
	public:
		ShapeTwoD();
		ShapeTwoD(string,bool);
		//virtual ~ShapeTwoD(){};
		void setName(string);
		void setContainsWarpSpace(bool);
		void setX(int);
		void setY(int);
		int getX();
		int getY();
		string getName();
		bool getContainsWarpSpace();
		vector<unique_ptr<ShapeTwoD>>getVector();
		virtual double computeArea();
		virtual bool isPointInShape(int,int);
		virtual bool isPointOnShape(int,int);
		virtual string toString();
		
		
		
};

class Cross:public ShapeTwoD{
	private:
		int x,y;
	public:
	void setX(int);
	void setY(int);
	int getX();
	int getY();
	Cross(string ,bool,int,int);
	double computeArea(); 
	
};

class Rectangle:public ShapeTwoD{
	private:
	int x,y;
	public:
	Rectangle(string,bool,int,int);
	void setX(int);
	void setY(int);
	int getX();
	int getY();
	double computeArea();
};
class Square:public ShapeTwoD{
	private:
	int x,y;
	public:
	Square(string,bool,int,int);
	void setX(int);
	void setY(int);
	int getX();
	int getY();
	double computeArea();
};
 
#endif


ShapeTwoD.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "ShapeTwoD.h"



ShapeTwoD::ShapeTwoD()
{

}
ShapeTwoD::ShapeTwoD(string sName,bool contain)
{
	setName(sName);
	setContainsWarpSpace(contain);
}
Square::Square(string sName,bool contain,int coordX, int coordY):ShapeTwoD(sName,contain)
{
	setX(coordX);
	setY(coordY);
}

Rectangle::Rectangle(string sName,bool contain,int coordX, int coordY):ShapeTwoD(sName,contain)
{
	setX(coordX);
	setY(coordY);
}

Cross::Cross(string sName,bool contain,int coordX, int coordY):ShapeTwoD(sName,contain)
{
	setX(coordX);
	setY(coordY);
}

double ShapeTwoD::computeArea()
{
	cout<<"No area computation defined"<<endl;
}

double Square::computeArea()
{
	//double area;
	
	//area = ((((x1-x2)^2+(y1-y2)^2)^0.5)+(((x1-x4)^2)+(((y1-y4)^2)^0.5)));
}

double Rectangle::computeArea()
{
	//double area;
	
	//area = ((((x1-x2)^2+(y1-y2)^2)^0.5)+(((x1-x4)^2)+(((y1-y4)^2)^0.5)));
}

double Cross::computeArea()
{
	
}



bool ShapeTwoD::isPointInShape(int coordx,int coordy)
{
	
}

bool ShapeTwoD::isPointOnShape(int coordx,int coordy)
{
	
}



void ShapeTwoD::setName(string sName)
{
	name=sName;
}
void ShapeTwoD::setContainsWarpSpace(bool contain)
{
	containsWarpspace=contain;
}
void Square::setX(int coordX)
{
	x=coordX;
}
void Square::setY(int coordY)
{
	y=coordY;
}

void Rectangle::setX(int coordX)
{
	x=coordX;
}
void Rectangle::setY(int coordY)
{
	y=coordY;
}
void Cross::setX(int coordX)
{
	x=coordX;
}
void Cross::setY(int coordY)
{
	y=coordY;
}



bool ShapeTwoD::getContainsWarpSpace()
{
	return containsWarpspace;
}

string ShapeTwoD::getName()
{
	return name;
}
int Square::getX()
{
	return x;
}
int Square::getY()
{
	return y;
}
int Rectangle::getX()
{
	return x;
}
int Rectangle::getY()
{
	return y;
}
int Cross::getX()
{
	return x;
}
int Cross::getY()
{
	return y;
}
vector<unique_ptr<ShapeTwoD>>ShapeTwoD::getVector()
{
	return shape;
}
string ShapeTwoD::toString()
{
	
}


display.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "ShapeTwoD.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */




void input(vector<unique_ptr<ShapeTwoD>>& newCoords)
{
		
	int x,y;
	string s;
	bool b = true;
		cout<<"name?"<<endl;
		getline(cin,s);
		cout<<"Please enter value of x"<<endl;
		cin>>x;
		cout<<"Please enter value of y"<<endl;
		cin>>y;
		
		//Square sq(s,b,x,y);
		newCoords.emplace_back(new Square(s,b,x,y));
	
}
	


int main(int argc, char** argv) {
	ShapeTwoD sh; 
	vector<unique_ptr<ShapeTwoD>>v= sh.getVector();
	input(v);
	return 0;
}
ShapeTwoD::getVector() returns a copy of the shape vector but the problem is that the unique_ptrs can't be copied. That is why you get an error.

You could make it work by returning a reference, but does it really make sense to have each ShapeTwoD object contain a vector of shapes? Isn't it better to create the vector in main and simply pass it to the input function.

1
2
3
4
5
int main()
{
	vector<unique_ptr<ShapeTwoD>> shapes;
	input(shapes);
}
Topic archived. No new replies allowed.