Struggling With OOP and Vectors

Pages: 12
Hi,

Yeah OK i think i will shelf this project for a bit. I have done quite a bit of C but this is quite a bit different tbh. I will resort back to the drawing board lol.

Cheers.
With string added, the two errors:

1) no default constructor exists for class 'Seat'

2) 'Seat': no appropriate default constructor available
It's impossible to know what's wrong without seeing the code where these lines occur. Better yet, post the entire program that's giving this error.

Otherwise it's like asking an auto repair shop what's wrong with your car without showing them the car itself.
Hi dhayden,

I am stuck on a number of key parts which is kinda holding up my progress.

1) In the 'Seat' class 'isReserved()' returns a true(1) if a passenger has made a booking. In 'main' on case2 i should get a 'Yes' when passenger details have been added but I get a 'No'. 'Person' is a friend with 'Seat' so this should work but i cannot see why it doesn't?

2) In the 'Plane' class 'void BookSeat(const Person &)' and 'void CancelSeat(const Person &)' is that receiving an object from main. I have never seen the '&' after the type but usually before?

3) Also in the 'Plane' class 'Seat *numToSeat(const string &num)' and 'Seat *personToseat(const Person &person)' do both of these receive objects and return pointers?

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstdbool>

using namespace std;

// Forward declarations
class Seat;
class Plane;

// ********************* Person Class *************************
class Person
{
public:
	void Name();
	void Age();
	void Sex();
	friend class Plane; 
	friend class Seat;  

private:
	string m_name;  
	string m_age;
	string m_sex;
};

void Person::Name() 
{
	cout << "Enter name: \n";
	cin >> m_name;

}

void Person::Age()
{
	cout << "Enter age: \n";
	cin >> m_age;
}

void Person::Sex()
{
	cout << "Enter sex: \n";
	cin >> m_sex;
}


// ********************* Seat Class *************************
class Seat
{
public:
	Seat::Seat(const string &num) : m_number(num)  {} 
	bool Seat::isReserved() const { return m_person.m_name.size(); }
	void SeatNumber();
	string getNumber() const;
	friend class Plane;

private:
	string m_number;
	Person m_person;
	string num;
};

void Seat::SeatNumber()
{

}

string Seat::getNumber() const 
{ 
	return m_number; 
}



// ********************* Plane Class *************************
class Plane
{
public:
	Plane();
	void AvailableSeats();
	void BookSeat(const Person &);
	void CancelSeat(const Person &);


	// Given a seat number, return the corresponding seat in m_seat vector,
	// or nullptr if the number is bad
	Seat *numToSeat(const string &num);
	Seat *personToseat(const Person &person);
private:
	
	vector<Seat> m_seats;
};

Plane::Plane()
{

}

void Plane::AvailableSeats()
{
/*
	vector<string>::const_iterator iter;

	for (iter = m_seats.begin(); iter != m_seats.end(); ++iter)
	{
		cout << *iter;
		cout << "\t";
	}
	cout << endl;
*/

}

void Plane::BookSeat(const Person &)
{
	
	//m_seats.push_back(value);

}

void Plane::CancelSeat(const Person &)
{

}

/*
Seat *numToSeat(const string &num)
{
	// num is an object being sent from main
	//return num;
}
*/

/*
Seat *personToseat(const Person &person)
{
	// person is an object being send from main
	//return person;
}
*/


// ********************* Main ********************************
int main()
{
	Plane plane;
	Seat seat("1"); 
	Person passenger;


	cout << "Welcome to Airline Booking\n\n";
	cout << "Please select from the following choices: \n\n";

	int choice;

	do
	{
		cout << "\n\n";
		cout << "1) View available seats: \n";
		cout << "2) Make a booking: \n";
		cout << "3) exit: \n\n";
		cin >> choice;

		switch (choice)
		{
		case 1:
		{
			plane.AvailableSeats();
			break;
		}

		case 2:
		{
			// enter passanger details
			passenger.Name();
			passenger.Age();
			passenger.Sex();

			// display available seats

			// seat number
			string seatnumber;
			seatnumber = seat.getNumber();
			cout << "Seat number \n" << seatnumber << endl;

			// seat status booked 
			bool SeatStatus;
			SeatStatus = seat.isReserved();
			if (SeatStatus == true)
			{
				cout << "Yes\n";
			}
			else
			{
				cout << "No\n";
			}


			// return passenger details back to main
			//vector<string> PassengerData;
			//PassengerData = passenger.ReadData();
			//plane.BookSeat(passenger);

			break;
		}

		case 3:
		{
			cout << "exit.\n\n";
			break;
		}

		default:
		{
			cout << "Sorry try again. \n\n ";
			break;
		}
		}

	} while (choice != 3);

	return 0;

}


Lines 53 & 54: remove Seat::. You don't need it inside the class declaration.
Lines 60 & 62. What's the difference between m_number and num? num seems to be unused.

i should get a 'Yes' when passenger details have been added but I get a 'No'.
You never add the passenger details to the seat.

2) In the 'Plane' class 'void BookSeat(const Person &)' and 'void CancelSeat(const Person &)' is that receiving an object from main. I have never seen the '&' after the type but usually before?
The & in this context passes a "reference" to the person as the parameter. Normally that would mean that any change to the person in BookSeat() would also change the object passed into from main, but I've also declared it a const Person &, which means the compiler won't let you change it. The reason to pass a const reference is that it's faster than making a copy of the person.

What I envisioned for #2 is this:
1
2
3
4
5
6
7
8
9
10
               case 2:
                {
                        // enter passanger details
                        passenger.Name();
                        passenger.Age();
                        passenger.Sex();

                        plane.bookSeat(passenger);
                        break;
                }


and the bookSeat() would be like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
void Plane::BookSeat(const Person &)
{
    // display available seats
    AvailableSeats();

    // Prompt for a seat number.
    // Find the seat number
    // use numToSeat() to find the seat with the given number
    // If there is no such seat, then say the number enter is invalid
    // else if the seat is reserved, then say it's reserverd
    // else assign the person to the seat.

}


I urge you to get option 1 working first (print the available seats). I'd print "**" where seats have been reserved and the seat number where they are available.

Right now there are no seats in the plane. Where should you add them? In the real world, when are the seats added to a plane? When it is CONSTRUCTed.... :)
A reference ("&") is like a constant pointer. That is, a pointer whose value cannot be changed once created/initialized:

int* const ptr = new int;

int& ref = *new int

A const pointer cannot change what it points to, but it can dereference and change the value of its pointed-to data. A reference cannot change what it refers to, but it can change its refered-to data's value.

However, you should think of a reference as the object being passed ITSELF. Meaning, you should think of a reference as an alias for the original variable/data's name or identifier. Thus when you pass by reference, you do not make a copy of the data, you simply pass the data itself to the function. This is conveniently done without pointer like semantics.
Last edited on
I had some free time, and so I decided by me to invest some effort to 'finish' your program in such a manner that it consists of some c++ techniques. I guess, some of them you may not understand right now, because it consists of specific techniques. But I made this because I would show you how a passable C++ program could look. If you don't understand some of its techniques, this is a good point for researching. And don't hesitate to ask here in the forum.

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <limits>
#include <algorithm>

// ********************* Person Class *************************
class Person
{
public:
    Person( std::string name = "", int age = -1 , char sex = 'u')
    : m_name{name},m_age{age},m_sex{sex}
    {}
        
    void name( const std::string & n ) { m_name = n; }
    std::string name() const { return m_name; }
    std::string & name() { return m_name; }
	
    void age( int a ) { m_age = a; }
    int age() const { return m_age; }
    int & age() { return m_age; }
	
    void sex( char s )  { m_sex = s; }
    char sex() const { return m_sex; }
    char & sex() { return m_sex; }
    
    void setData( std::istream &, std::ostream &);
    
private:
    std::string m_name;
    int m_age;
    char m_sex;
};

void Person::setData( std::istream & is = std::cin, std::ostream & os = std::cout )
{
    os << "Enter name: ";
    std::getline( is, m_name );
    
    os << "Enter age: ";
    is >> m_age;
    
    os << "Enter sex (m/w/u): ";
    is >> m_sex;
}
    
std::ostream & operator<<( std::ostream & os, const Person & p)
{
    os <<"Name: "<<p.name() << ", Age: "<<p.age()<<", Sex: ";
    
    if( p.sex() == 'm' ) os << "male";
    else if( p.sex() == 'w') os << "female";
    else os << "unspecified";
    
    return os;
}

std::istream & operator>>( std::istream & is, Person & p)
{
    std::string tmp_name;
    std::getline( is, tmp_name );
    p.name( tmp_name );
    
    int tmp_age;
    is >> tmp_age;
    p.age( tmp_age );
    
    char tmp_sex;
    is >> tmp_sex;
    p.sex( tmp_sex );
    
    return is;
}

// ********************* Seat Class *************************
class Seat
{
public:
    Seat(const std::string & number = "A1") 
    : m_number{number}, m_person{Person()}
    {} 

    bool isReserved() const { return m_person.name().size(); }
	
    Person person() const { return m_person; }
    Person & person() { return m_person; }
    void person( const Person & p ) { m_person = p; }
	
    std::string number() const { return m_number; }
    std::string & number() { return m_number; }
    void number( const std::string & n ) { m_number = n; }

private:
    std::string m_number;
    Person m_person;
};

std::ostream & operator<<( std::ostream & os, const Seat & seat)
{
    os << "number: "<<seat.number()<<"\n";
    if( seat.person().name().size() )
        os << seat.person()<<"\n";
    else
        os << "free\n";
    return os;
}


// ********************* Plane Class *************************
class Plane
{
public:
	Plane( int noOfSeats );
	
	Seat seat( const std::string & number );
	void availableSeats() const;
	bool isSeatAvailable( const std::string & seatNum) const; 
	int freeSeats() const;
	bool bookSeat(const Person &, const std::string & seatNum);
	bool cancelSeat(const Person &);
	Seat findSeat( const std::string & name );

private:
	friend std::ostream & operator<<( std::ostream &, const Plane &);
	std::vector<Seat> m_seats;
	int m_freeSeats;
};

Plane::Plane( int noOfSeats )
: m_freeSeats{noOfSeats}
{ 
    for( int i = 0; i < noOfSeats; ++i )
    {
        char row = i / 4 + 'A';
        
        m_seats.push_back( Seat(
            std::string("") + row
            + std::to_string( i % 4 + 1)
        ) );
    }
}

Seat Plane::seat( const std::string & num )
{
    for( auto & seat : m_seats )
    {
        if( seat.number() == num )
            return seat;
    }
    throw std::runtime_error("Wrong seat number!");
}
 
void Plane::availableSeats() const 
{
    if( !m_freeSeats ) std::cout << "No free seats.";
    
    for( const auto & seat : m_seats )
    { 
        if( !seat.person().name().size() )
            std::cout << seat.number() << ' ';
        else
           std::cout << "* ";
    }
}

bool Plane::isSeatAvailable( const std::string & number) const
{
    for( const auto & seat : m_seats )
        if( seat.number() == number && seat.person().name() == "" )
            return true;
    return false;
}
    
int Plane::freeSeats()  const { return m_freeSeats; }


bool Plane::bookSeat( const Person & p, const std::string & seatNum)
{
    auto itr = std::find_if( m_seats.begin(), m_seats.end(),
        [&] (const Seat & seat) { return seat.number() == seatNum; }
    );
    if( itr == m_seats.end() ) return false;
    itr->person( p );
    -- m_freeSeats;
    return true;
}

bool Plane::cancelSeat( const Person & person )
{
    for( int i = 0; i < m_seats.size(); ++i )
    {
        if( m_seats[i].person().name() == person.name() )
        {
            m_seats[i].person().name( "" );
            ++ m_freeSeats;
            return true;
        }
    }
    return false;
}

Seat Plane::findSeat( const std::string & name )
{
    for( auto & seat : m_seats )
    {
        if( seat.person().name() == name )
            return seat;
    }
    throw std::runtime_error( "Could not find seat!" );
}

std::ostream & operator<< ( std::ostream & os, const Plane & plane )
{
    for( const auto & seat : plane.m_seats )
    {
        os << seat.number() << ": ";
        
        if( seat.person().name().size() )
            os << seat.person();
        else
            os << "free";
            
        os << "\n";
    }
    return os;
} 

// **************** freestanding functions ******************

void book( Plane & plane )
{
    using namespace std;
    
    cout << "Enter seat: ";
    string seatNum;
    cin >> seatNum;
    cin.ignore(999, '\n' );

    if( !plane.isSeatAvailable(seatNum) )
    {
        cout << "Seat " << seatNum
             << " is not available.\n";
        return;
    }
    // enter passenger details
    Person passenger;
    passenger.setData();
    cout << '\n';

    if( !plane.bookSeat(passenger, seatNum) )
    {
        cout << "Booking for " << passenger.name() << " failed!\n";
    } else {
        cout << "Booked seat:\n" 
             << plane.findSeat(passenger.name()) << "\n";
    }
}

// ********************* Main ********************************
int main()
{
        using namespace std;
        
	Plane plane( 100 );


	cout << "Welcome to Airline Booking\n\n";
	cout << "Please select from the following choices: \n\n";

	int choice;

	do
	{
		cout << "\n\n";
		cout << "1) View available seats: \n";
		cout << "2) Make a booking: \n";
		cout << "3) exit: \n\n";
		cin >> choice;
	        cin.ignore(999, '\n' );

		switch (choice)
		{
		case 1:
		{
			cout << "Available seats: ";
			plane.availableSeats();
			break;
		}

		case 2:
		{
		        // booking a passenger
		        book( plane );
			break;
		}

		case 3:
		{
			cout << "exit.\n\n";
			break;
		}

		default:
		{
			cout << "Sorry try again. \n\n ";
			break;
		}
		}

	} while (choice != 3);

	return 0;
}
Last edited on
Nuderobmonkey, your Plane class has 3 copies of the same basic code to find a seat by number: see seat(), isSeatAvailable(), and bookSeat(). Also findSeat() throws an exception that isn't caught. These are the reasons why I suggested a numToSeat() function to find a seat from the number and return a pointer to it, or nullptr.

Also your booking process is a little awkward. The code has to find the seat 3 times: once in isSeatAvailable(), once in bookSeat() and once in findSeat() after the booking. Also, bookSeat() will never return false because by the time you call it, you know that the seat number is valid. To clean this up, I called seatToNum() inside case 2 and changed bookSeat() to take a reference to a seat.

[Edit: the code below is based on an earlier version of Nuderobmonkey's code. ]
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <limits>
#include <algorithm>

// ********************* Person Class *************************
class Person
{
public:
    Person( std::string name = "", int age = -1 , char sex = 'u')
    : m_name{name},m_age{age},m_sex{sex}
    {}
        
    void name( const std::string & n ) { m_name = n; }
    std::string name() const { return m_name; }
    std::string & name() { return m_name; }
	
    void age( int a ) { m_age = a; }
    int age() const { return m_age; }
    int & age() { return m_age; }
	
    void sex( char s )  { m_sex = s; }
    char sex() const { return m_sex; }
    char & sex() { return m_sex; }
    
    void setData( std::istream &, std::ostream &);
    
private:
    std::string m_name;
    int m_age;
    char m_sex;
};

void Person::setData( std::istream & is = std::cin, std::ostream & os = std::cout )
{
    os << "Enter name: ";
    std::getline( is, m_name );
    
    os << "Enter age: ";
    is >> m_age;
    
    os << "Enter sex (m/w/u): ";
    is >> m_sex;
}
    
std::ostream & operator<<( std::ostream & os, const Person & p)
{
    os <<"Name: "<<p.name() << ", Age: "<<p.age()<<", Sex: "<<p.sex();
    return os;
}

std::istream & operator>>( std::istream & is, Person & p)
{
    std::string tmp_name;
    std::getline( is, tmp_name );
    p.name( tmp_name );
    
    int tmp_age;
    is >> tmp_age;
    p.age( tmp_age );
    
    char tmp_sex;
    is >> tmp_sex;
    p.sex( tmp_sex );
    
    return is;
}

// ********************* Seat Class *************************
class Seat
{
public:
    Seat(const std::string & number = "A1") 
    : m_number{number}, m_person{Person()}
    {} 

    bool isReserved() const { return m_person.name().size(); }
	
    Person person() const { return m_person; }
    Person & person() { return m_person; }
    void person( const Person & p ) { m_person = p; }
	
    std::string number() const { return m_number; }
    std::string & number() { return m_number; }
    void number( const std::string & n ) { m_number = n; }

private:
    std::string m_number;
    Person m_person;
};

std::ostream & operator<<( std::ostream & os, const Seat & seat)
{
    os << "number: "<<seat.number()<<"\n";
    if( seat.person().name().size() )
        os << seat.person()<<"\n";
    else
        os << "free\n";
    return os;
}


// ********************* Plane Class *************************
class Plane
{
public:
	Plane( int noOfSeats );
	
	void availableSeats() const;
	bool isSeatAvailable( const std::string & seatNum) const; 
	int freeSeats() const;
	void bookSeat(const Person &, Seat &);
	bool cancelSeat(const Person &);
	const Seat *numToSeat( const std::string & num ) const
	{ return const_cast<Plane*>(this) -> numToSeat(num); }
	Seat *numToSeat( const std::string & num );

private:
	friend std::ostream & operator<<( std::ostream &, const Plane &);
	std::vector<Seat> m_seats;
	int m_freeSeats;
};

Plane::Plane( int noOfSeats )
: m_freeSeats{noOfSeats}
{ 
    for( int i = 0; i < noOfSeats; ++i )
    {
        char row = i / 4 + 'A';
        
        m_seats.push_back( Seat(
            std::string("") + row
            + std::to_string( i % 4 + 1)
        ) );
    }
}

void Plane::availableSeats() const 
{
    if( !m_freeSeats ) std::cout << "No free seats.";
    
    for( const auto & seat : m_seats )
    { 
        if( !seat.person().name().size() )
            std::cout << seat.number() << ' ';
    }
}

bool Plane::isSeatAvailable( const std::string & number) const
{
    const Seat *s = numToSeat(number);
    return s && !s->isReserved();
}
    
int Plane::freeSeats()  const { return m_freeSeats; }


// Book the seat. "Seat" must be a seat on this plane and it must
// be available.
void Plane::bookSeat( const Person & p, Seat &seat)
{
    seat.person( p );
    --m_freeSeats;
}

bool Plane::cancelSeat( const Person & person )
{
    for( unsigned i = 0; i < m_seats.size(); ++i )
    {
        if( m_seats[i].person().name() == person.name() )
        {
            m_seats[i].person().name( "" );
            ++ m_freeSeats;
            return true;
        }
    }
    return false;
}

Seat *Plane::numToSeat( const std::string & num )
{
    for( auto & seat : m_seats )
    {
        if( seat.number() == num )
            return &seat;
    }
    return nullptr;
}

std::ostream & operator<< ( std::ostream & os, const Plane & plane )
{
    for( const auto & seat : plane.m_seats )
    {
        os << seat.number() << ": ";
        
        if( seat.person().name().size() )
            os << seat.person();
        else
            os << "free";
            
        os << "\n";
    }
    return os;
} 



// ********************* Main ********************************
int main()
{
        using namespace std;
        
	Plane plane( 100 );


	cout << "Welcome to Airline Booking\n\n";
	cout << "Please select from the following choices: \n\n";

	int choice = 2;

	do
	{
		cout << "\n\n";
		cout << "1) View available seats: \n";
		cout << "2) Make a booking: \n";
		cout << "3) exit: \n\n";
		cin >> choice;
	        cin.ignore(999, '\n' );

		switch (choice)
		{
		case 1:
		{
			cout << "Available seats: ";
			plane.availableSeats();
			break;
		}

		case 2:
		{
			cout << "Enter seat: ";
			string seatNum;
			cin >> seatNum;
			cin.ignore(999, '\n' );

			Seat *s = plane.numToSeat(seatNum);
			if (s == nullptr) {
			    cout << "Invalid seat number given\n";
			} else if (s->isReserved()) {
			    cout << "Seat " << seatNum
			         << " is not available.\n";
			} else {
			    // enter passenger details
			    Person passenger;
			    passenger.setData();
			    cout << '\n';

			    plane.bookSeat(passenger, *s);
			    cout << "Booked seat:\n" << *s << "\n";
			}
			break;
		}

		case 3:
		{
			cout << "exit.\n\n";
			break;
		}

		default:
		{
			cout << "Sorry try again. \n\n ";
			break;
		}
		}

	} while (choice != 3);

	return 0;
}
Last edited on
You could also use std::string_view instead of const std::string&
Many thanks for all you help.

I will work through it and try and understand.

It sure looks quite a beast finished.

Cheers,

Rocketman46
Topic archived. No new replies allowed.
Pages: 12