Compiling error.

I have a program that I have fully working if I only use 1 .cpp file and .h file together.

Problem is I have to link 2 .cpp files and the header file.


when I try to compile it gives me there errors

1>wizard.obj : error LNK2005: "class Wizard wiz2" (?wiz2@@3VWizard@@A) already defined in p2.obj
1>wizard.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > cursestring" (?cursestring@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A) already defined in p2.obj
1>wizard.obj : error LNK2005: "class Wizard wiz1" (?wiz1@@3VWizard@@A) already defined in p2.obj


Any ideas why this is happening?

Oh, and I'd include the files but it's too much to post. I'll try in a reply or something.
wizard.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
#include <string>
using namespace std;


enum Hogwarts {GRYFFINDOR,SLYTHERIN,RAVENCLAW,HUFFLEPUFF};
enum Ministry {INTERNATIONAL_MAGICAL_COOPERATION,MAGICAL_LAW_ENFORCEMENT,MAGICAL_TRANSPORTATION,REGULATIONS_AND_CONTROL_OF_MAGICAL_CREATURES,MYSTERIES,
				MAGICAL_GAMES_AND_SPORTS,MAGICAL_ACCIDENTS_AND_CATASTROPHIES};
enum HWRank {STUDENT,FACULTY,STAFF};
enum MinistryRank {OFFICIAL,AUROR,UNSPEAKABLE,DEPARTMENT_CHAIR,MINISTER};
enum DeathEaterRank {INITIATE,APPRENTICE,MASTER,LORD};
enum Organization{HOGWARTS,DEATH_EATERS,MINISTRY_OF_MAGIC};


Hogwarts GetHouse(string dummy, int index);
Ministry GetDept(string dummy, int index);
HWRank getRankH(string rank);
DeathEaterRank getRankDeath(string rank, char gender);
MinistryRank getRankMinistry(string rank);
void Run();

string cursestring;

class Wizard
{
public:
	string rank;
	string curse;
	char organization;
	string wizName;
	char gender;
	int EUPtotal;

	bool SetData(string name, char orgName);
	bool PrintIntro(ofstream& outputStream);
	void SetLoser();
	void SetWinner();
	bool IsLoser() const;
	bool IsWinner() const;
	bool IsHogwarts() const;
	bool IsDeathEater() const;
	bool IsMinistryOfMagic() const;
	int CurseImpact() const;
	

private:
	string org;
	int bDay;
	int bMonth;
	int bYear;
	Hogwarts house;
	Ministry department;
	int determination;
	string mentor;
	string dementor;
	string supervisor;
	HWRank rankH;
	MinistryRank rankM;
	DeathEaterRank rankD;
	string winOrLose;
	int cursePower;
	                                                                                                                                         
} wiz1, wiz2;
wizard.cpp part 1
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
#include <iostream>
#include <cstdlib> 
#include <fstream>
#include <string>
#include <iomanip>
#include "wizard.h"

using namespace std;

bool Duel(Wizard&w1, Wizard&w2);

bool Wizard::SetData(string name, char orgName)
{
	string cursestring;
	ifstream inFile;
	int value; //used to check whether the name is correct
	int index; //marks point in strings to get input for the struct
	string dummy; //holds substrings to be read into the struct
	string dummyTwo; //used to convert the substrings to ints or chars
	string check;
	string last;
	string full;
	char holder[256];

	cout << "Input the Wizard's name " << endl;
	cout << "Input is case sensitive. If the wizard has no last name type '[name] /n'" <<  endl;
	cout << " " << endl;
	cout << "Name: ";
	cin >> name;
	cin >> last;
	if (name == "Voldemort")
	{
		last = name;
		name = "Lord";
	}
	if (last == "/n" || last == " ")
		full = name;
	else
	full = name + " " + last;
	
	cout << "First initial of organization: ";
	cin >> orgName;
	organization = orgName;
	if (organization == 'h' || organization == 'H')
	{
		org = "Hogwarts";
		check = "hogwarts.in";
	}
		else if (organization == 'd' || organization == 'D')
		{
			org = "Death Eaters";
			check = "death_eaters.in";
		}
		else if (organization == 'm' || organization == 'M')
		{
			org = "Ministry of Magic";
			check = "ministry_of_magic.in";
		}
		else
		{
			cout << "Invalid Response" << endl;
			return false;
		}


	inFile.open(check.c_str());
	getline(inFile, dummy);

	

	value = dummy.find(full);
	while (value != 0 && inFile)
	{
		
	getline(inFile, dummy);
	value = dummy.find(full);
	}
	if (inFile.eof())
	{
		cout << "Invalid Name" << endl;
		return false;
	}
	index = dummy.find("#");
		wizName = dummy.substr(0, index);
		dummy = dummy.substr(index+1, dummy.length() - 1);

	index = dummy.find("/");
		dummyTwo = dummy.substr(0, index);
		bMonth = atoi(dummyTwo.c_str());
		dummy = dummy.substr(index+1, dummy.length() - 1);
		
	index = dummy.find("/");
		dummyTwo = dummy.substr(0, index);
		bDay = atoi(dummyTwo.c_str());
		dummy = dummy.substr(index+1, dummy.length() - 1);

	index = dummy.find("#");
		dummyTwo = dummy.substr(0, index);
		bYear = atoi(dummyTwo.c_str());
		dummy = dummy.substr(index+1, dummy.length() - 1);

	index = dummy.find("#");
	if (organization == 'h' || organization == 'H')
	{  
		house = GetHouse(dummy, index);
		dummy = dummy.substr(index+1, dummy.length() - 1);
	}
		else if (organization == 'm' || organization == 'M')
		{
			department = GetDept(dummy, index);
			dummy = dummy.substr(index+1, dummy.length() - 1);
		}
		else
		{}	//nothing happens

	index = dummy.find("#");
		dummyTwo = dummy.substr(0, index);
		determination = atoi(dummyTwo.c_str());
		dummy = dummy.substr(index+1, dummy.length() - 1);

	index = dummy.find("#");
		dummyTwo = dummy.substr(0,index);
		if (dummyTwo == "m")
			{
				gender = 'm';
		}
		else
			{
				gender = 'f';
		}

		dummy = dummy.substr(index+1, dummy.length() - 1);

	index = dummy.find("#");
	
	if (organization == 'h' || organization == 'H')
	{  
		mentor = dummy.substr(0,index);
		
	}
		else if (organization == 'm' || organization == 'M')
		{
			supervisor = dummy.substr(0,index);
			
		}
		else
		{
			dementor = dummy.substr(0,index);
		}
		dummy = dummy.substr(index+1, dummy.length() - 1);

	index = dummy.find("#");
		rank = dummy.substr(0,index);
	if (organization == 'h' || organization == 'H')
		{
			rankH = getRankH(rank);
		}
		
	else if (organization == 'm' || organization == 'M')
		{
			rankM =  getRankMinistry(rank);
		}
		
	else
		{
			rankD =  getRankDeath(rank,gender);
		}

	inFile.close();
	cout << "Name of curse used ending with '#': ";
	getline(cin, cursestring);
	
	inFile.open("curses.in");
	cin.getline(holder, 256, '#');
	cursestring = holder;
	value = curse.find(cursestring);
	while (value != 0 && inFile)
	{
		getline(inFile, curse);
		value = curse.find(cursestring);
	}
	
	if (inFile.eof())
		return false;
	else	
	{
		index = curse.find('#');
		dummy = curse;
		curse = dummy.substr(0,index);
		dummy = dummy.substr(index+1 , dummy.length() - 1);
		index = dummy.find('#');
		dummy = dummy.substr(0,index);
		
		cursePower = atoi(dummy.c_str());
		
		inFile.close();
		EUPtotal = CurseImpact();

		return true;
	}
}

bool Wizard::PrintIntro(ofstream& outputStream)
{
	if(!outputStream)
		return false;
	else
	outputStream << wizName << endl;
	outputStream << "Born " << bMonth << "/" << bDay << "/" << bYear
				 << ", ";
	if (gender == 'm')
		outputStream << "he joined ";
	else
		outputStream << "she joined ";
	if (organization == 'h' || organization == 'H')
		outputStream << org;
	else 
		outputStream << "the " << org;

	outputStream << " and later reached rank " << rank << " under ";
	if (organization == 'h' || organization == 'H')
		outputStream << mentor << endl;
	else if (organization == 'm' || organization == 'M')
		outputStream << supervisor << endl;
	else
		outputStream << dementor << endl;
	return true;
}
wizard.cpp part 2
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
int Wizard::CurseImpact() const
{
	int total;

	if (curse == "crucio" || curse == "imperio" || curse == "avada kedavra")
		total = determination * cursePower;
	else
		total = cursePower;
	return total;
}

void Wizard::SetWinner()
{
	winOrLose = "WINNER";
	return;
}

void Wizard::SetLoser()
{
	winOrLose = "LOSER";
	return;
}

bool Wizard::IsWinner() const
{
	if (winOrLose == "WINNER")
		return true;
	else
		return false;
}

bool Wizard::IsLoser() const
{
	if (winOrLose == "LOSER")
		return true;
	else
		return false;
}

bool Wizard::IsHogwarts() const
{
	if (organization == 'h' || organization == 'H')
		return true;
	else
		return false;
}

bool Wizard::IsDeathEater() const
{
	if (organization == 'd' || organization == 'D')
		return true;
	else
		return false;
}

bool Wizard::IsMinistryOfMagic() const
{
	if (organization == 'm' || organization == 'M')
		return true;
	else
		return false;
}

Hogwarts GetHouse(string dummy, int index)
{
	if (dummy.substr(0,index) == "GRYFFINDOR")
	{
		return GRYFFINDOR;
	}
	else if (dummy.substr(0,index) == "SLYTHERIN")
	{
		return SLYTHERIN;
	}
	else if (dummy.substr(0,index) == "RAVENCLAW")
	{
		return RAVENCLAW;
	}
	else
	{
		return HUFFLEPUFF;
	}
}

Ministry GetDept(string dummy, int index)
{
	if (dummy.substr(0,index) == "INTERNATIONAL_MAGICAL_COOPERATION")
	{
		return INTERNATIONAL_MAGICAL_COOPERATION;
	}
	else if (dummy.substr(0,index) == "MAGICAL_LAW_ENFORCEMENT")
	{
		return MAGICAL_LAW_ENFORCEMENT;
	}
	else if (dummy.substr(0,index) == "MAGICAL_TRANSPORTATION")
	{
		return MAGICAL_TRANSPORTATION;
	}
	else if (dummy.substr(0,index) == "REGULATIONS_AND_CONTROL_OF_MAGICAL_CREATURES")
	{
		return REGULATIONS_AND_CONTROL_OF_MAGICAL_CREATURES;
	}
	else if (dummy.substr(0,index) == "MYSTERIES")
	{
		return MYSTERIES;
	}
	else if (dummy.substr(0,index) == "MAGICAL_GAMES_AND_SPORTS")
	{
		return MAGICAL_GAMES_AND_SPORTS;
	}
	else
	{
		return MAGICAL_ACCIDENTS_AND_CATASTROPHIES;
	}
}
HWRank getRankH(string rank)
{
	if (rank == "Student")
	{
		return STUDENT;
	}
	else if (rank == "Staff") //haha, my last name
	{
		return STAFF;
	}
	else
	{
		return FACULTY;
	}
}
DeathEaterRank getRankDeath(string rank, char gender)
{
	if (rank == "Initiate")
	{
	return INITIATE;
	}
	else if (rank ==  "Apprentice")
	{
		return APPRENTICE;
	}
	else if (rank == "Master")
	{
		if (gender == 'f')
		{
			rank = "Mistress";
		}
		return MASTER;
	}
	else
	{
		if (gender == 'f')
		{
			rank = "Lady";
		}
		return LORD;
	}
}

MinistryRank getRankMinistry(string rank)
{
	if (rank == "Official")
	{
		return OFFICIAL;
	}
	else if (rank == "Auror")
	{
		return AUROR;
	}
	else if (rank == "Unspeakable")
	{
		return UNSPEAKABLE;
	}
	else if (rank == "Minister")
	{
		return MINISTER;
	}
	else
	{
		return DEPARTMENT_CHAIR;
	}
}

void Run()
{
	ifstream inFile;
	ofstream outputStream;

	char orgName;
	string name;

	wiz1.SetData(name, orgName);
	wiz2.SetData(name, orgName);
	outputStream.open("results.out");
	wiz1.PrintIntro(outputStream);
	wiz2.PrintIntro(outputStream);
	wiz1.CurseImpact();
	wiz2.CurseImpact();
	Duel(wiz1, wiz2);
	return;
}

bool Duel(Wizard& wiz1, Wizard& wiz2)
{
	int i;

	if (wiz2.IsLoser() == true || wiz1.IsLoser() == true)
		return false;
	else
	{
		if (wiz1.EUPtotal > wiz2.EUPtotal)
		{
			wiz1.SetWinner();
			wiz2.SetLoser();
		}
		else if (wiz1.EUPtotal < wiz2.EUPtotal)
		{
			wiz1.SetLoser();
			wiz2.SetWinner();
		}
		else
		{
				srand(time(NULL));
				i = rand();
			
				i = i % 2;
			
				if (i == 0)
				{
					wiz1.SetWinner();
					wiz2.SetLoser();
				}
				else
				{
					wiz1.SetLoser();
					wiz2.SetWinner();
				}
				
		}
		return true;
	}
}


and p2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <string>
#include <iomanip>
#include "wizard.h"

using namespace std;

int main()
{
	Run();
	return 0;
}


That's all of it. Hopefully I'm not going against the rules doing this
Last edited on
You appear to be missing a header guard on wizard.h and it's being included twice.

Also, a using statement in a header file is a not a good idea as in wizard.h line 2:

using namespace std;

Doing this pulls in the entire std namespace so that every time you include wizard.h everything in the std namespace comes along for the ride. Sooner or later this will lead to identifier name conflicts. In a header file it is best to leave out the using statement and fully qualify the identifiers you need such as std::string instead of string.
Topic archived. No new replies allowed.