I'm trying to add elements to a vector in my program. But I'm not sure if I'm doing it right. So far what I have below does not work. I get an error that says:
error LNK2019: unresolved external symbol "public: __thiscall MySet::MySet(void)" (??0MySet##QAE#XZ) referenced in function _main
Here is my code:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
class MySet{
public:
vector<int> elements;
MySet();
void addElement(int value);
int removeElement(int index);
int sum();
int size();
};
void MySet::addElement(int value){
elements.push_back(value);
}
int main(int argc, char *argv[]){
int value;
MySet set;
cout << "Enter your numbers " << endl;
cin >> value;
while(value != -1){
set.addElement(value);
}
system("PAUSE");
}
first:
You never define your MySet ctor.Define it or remove your declaration of MySet().
second:
cin>>value out of while loop,so just input once,you maybe want write code like this:
EDIT:
while(cin >> value){
if(value==-1)
break;
set.addElement(value);
}
Let's take this snippet code :
class MyClass
{
public:
int m_num;
MyClass(int n) { m_num = n;}
}
If I create an object of this class the following way :
MyClass mc1(5);
MyClass mc2(mc1);
This calls to the default copy-constructor and it'll automatically assign mc2.m_num = mc1.m_num ?
Also if there's a call inside the class which makes an instance the following way :
MyClass mc3(*this);
This will call to the default copy-constructor same as with mc2 the *this is just getting the object itself to be copied ?
Second problem I'm having is with compiling my code with Microsoft Visual Studio 2013.
I've made a String class and when I try to compile I get lot's of linking error telling me that the functions are already defined for some reason.
String.h :
#pragma once
class String
{
private:
char* m_szStr;
unsigned int m_length;
public:
String(const char*);
explicit String(unsigned int);
String(const String&);
~String();
String& operator=(const String&);
bool operator==(const String&) const;
String operator+(const String&) const;
operator const char*() const;
int findStr(char*) const;
int getLen() const;
void copyStr(const char*);
};
String.cpp:
#include "stdafx.h"
#include "String.h"
String::String(const char* pch)
{
m_szStr = NULL;
copyStr(pch);
}
String::String(unsigned int len)
{
m_length = len;
m_szStr = new char[m_length];
}
String::String(const String& that)
{
copyStr(that.m_szStr);
}
String::~String()
{
delete[] m_szStr;
}
String& String::operator=(const String& that)
{
copyStr(that.m_szStr);
return *this;
}
bool String::operator==(const String& that) const
{
if (m_length != that.m_length)
return false;
for (unsigned int i = 0; i < m_length; i++)
{
if (m_szStr[i] != that.m_szStr[i])
return false;
}
return true;
}
String String::operator+(const String& that) const
{
String temp(m_length + that.m_length - 1);
unsigned int offset = m_length;
for (unsigned int i = 0; i < that.m_length; i++)
{
temp.m_szStr[offset] = that.m_szStr[i];
}
return temp;
}
String::operator const char*() const
{
return m_szStr;
}
int String::findStr(char* pch) const
{
unsigned int offset = 0;
unsigned int strIndex = -1;
for (unsigned int i = 0; m_szStr[i] != NULL && pch[offset] != NULL; i++)
{
if (m_szStr[i] == pch[offset])
{
if (strIndex == -1)
strIndex = i;
offset++;
}
else
{
strIndex = -1;
offset = 0;
}
}
return strIndex;
}
int String::getLen() const
{
unsigned int len = 0;
for (unsigned int i = 0; m_szStr[i] != NULL; i++)
{
len++;
}
return len;
}
void String::copyStr(const char* pch)
{
if (!m_szStr)
delete[] m_szStr;
unsigned int pchLen = 0;
for (unsigned int i = 0; pch[i] != NULL; i++)
{
pchLen++;
}
m_length = pchLen;
m_szStr = new char[m_length];
for (unsigned int i = 0; i < m_length; i++)
{
m_szStr[i] = pch[i];
}
}
Code file:
#include "stdafx.h"
#include <iostream>
#include "String.cpp"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])s
{
String s1("Hi!");
String s2(5);
s2 = "Hello, Hi!";
const char* pch = static_cast<const char*>(s2);
cout << pch << endl;
return 0;
}
errors:
Error 1 error LNK2005: "public: __thiscall String::String(class String const &)" (??0String##QAE#ABV0##Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 2 error LNK2005: "public: __thiscall String::String(unsigned int)" (??0String##QAE#I#Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 3 error LNK2005: "public: __thiscall String::String(char const *)" (??0String##QAE#PBD#Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 4 error LNK2005: "public: __thiscall String::~String(void)" (??1String##QAE#XZ) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 5 error LNK2005: "public: class String & __thiscall String::operator=(class String const &)" (??4String##QAEAAV0#ABV0##Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 6 error LNK2005: "public: bool __thiscall String::operator==(class String const &)const " (??8String##QBE_NABV0##Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 7 error LNK2005: "public: __thiscall String::operator char const *(void)const " (??BString##QBEPBDXZ) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 8 error LNK2005: "public: class String __thiscall String::operator+(class String const &)const " (??HString##QBE?AV0#ABV0##Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 9 error LNK2005: "public: void __thiscall String::copyStr(char const *)" (?copyStr#String##QAEXPBD#Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 10 error LNK2005: "public: int __thiscall String::findStr(char *)const " (?findStr#String##QBEHPAD#Z) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 11 error LNK2005: "public: int __thiscall String::getLen(void)const " (?getLen#String##QBEHXZ) already defined in assignment4.obj C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj assignment4
Error 12 error LNK1169: one or more multiply defined symbols found C:\Users\****\Desktop\C++ Programming\assignment4\Debug\assignment4.exe 1 1 assignment4
In your main code file, write:
#include "String.h" // with .cpp you redefine everything !!
Currently you include String.cpp. So in your main file you will redefine everything you have already defined in String.cpp. It will compile, but the linker will be confused because he will find a definition for your String member functions in String.obj as well as in main.obj ("one definition rule").
And you already answerd yourself your copy constructor question
I have written this code using SDL but there are some errors.
This is the code
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>
#include <fstream>
#include <iostream>
using namespace std;
/////////////////////////////////// functions & global variable ////////////////////////////////
SDL_Window* window;
SDL_Renderer* renderer;
SDL_Color textColor;
TTF_Font* font;
SDL_Surface* surface=SDL_GetWindowSurface(window);
SDL_Event event;
SDL_Texture* LoadTexture(char* path)
{
SDL_Surface* surface = IMG_Load(path);
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer,surface);
SDL_FreeSurface(surface);
return texture;
}
///////////////////////////////////// Cell /////////////////////////////////////
class Cell
{
private:
char num;
public:
Cell();
Cell(int ,int ,char);
char * img;
pair <int ,int> cor;
int flag;
int size;
void display();
bool indomain(int ,int);
};
Cell :: Cell(int x ,int y ,char n){
num=n;
cor.first=x;
cor.second=y;
size=40;
flag=0;
if (num == '#')
img="0.png";
else if (num == '!')
img="1.png";
else
img="street.png";
}
bool Cell :: indomain(int x ,int y){
if ( (cor.first<=x && x<=cor.first+size) && (cor.second<=y && y<=cor.second+size))
return true;
return false;
}
void Cell :: display(){
SDL_Rect rect;
rect.x=cor.first;
rect.y=cor.second;
SDL_Texture* texture = LoadTexture(img);
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
//////////////////////////////////////////// Tower /////////////////////////////////////////
class Tower
{
public:
Tower();
Tower(int ,int ,int ,int ,char* ,int ,int ,int);
~Tower();
int price;
int up_cost;
char * img;
int power;
int domain;
int grade;
int index;
pair <int ,int> cor;
void upgrade();
void display();
bool mark(int ,int);
};
Tower :: Tower(int pr ,int co ,int pow ,int dom ,char* im ,int x ,int y ,int i){
price=pr;
up_cost=co;
power=pow;
domain=dom;
img=im;
cor.first=x;
cor.second=y;
grade=1;
index=i;
}
void Tower :: upgrade(){
if (grade<5)
{
grade+=1;
power*=2;
domain*=1.2;
price*=1.2;
}
}
void Tower :: display(){
SDL_Rect rect;
rect.x=cor.first;
rect.y=cor.second;
SDL_Texture* texture = LoadTexture(img);
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
bool Tower :: mark(int x, int y){
if ((cor.first<=x && x<=cor.first+40) && (cor.second<=y && x<=cor.second+80))
return true;
return false;
}
//////////////////////////////// Enemy //////////////////////////////////////
class Enemy
{
public:
Enemy();
Enemy(int ,char* ,int ,int ,int);
~Enemy();
char * img;
int health;
int cellNum;
int index;
pair <int ,int> cor;
bool live();
void display();
void damge(Tower t);
};
Enemy :: Enemy(int h ,char* im ,int x ,int y ,int i){
health=h;
img=im;
cor.first=x;
cor.second=y;
cellNum=0;
index=i;
}
bool Enemy :: live(){
if (health>0)
return true;
return false;
}
void Enemy :: damge(Tower t){
health-=t.power;
}
void Enemy :: display(){
SDL_Rect rect;
rect.x=cor.first;
rect.y=cor.second;
SDL_Texture* texture = LoadTexture(img);
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
///////////////////////////////////////////// Map ///////////////////////////////////////
class Map
{
private:
char * file;
int len;
public:
Map();
Map(char* ,int);
~Map();
Cell map[15][20];
pair <int ,int> * path;
void display();
void put_tower(Tower ,Cell);
void put_enemy(Enemy ,Cell);
void remove(Cell);
void enemyMove(Enemy);
void pathFinder(int);
};
Map :: Map(char * f ,int l){
file=f;
len=l;
ifstream infile;
infile.open(file);
char * line=new char;
for (int i=0;i<15;i++)
{
infile >> line;
for (int j=0;j<20;j++)
map[i][j]=Cell(j*40 ,i*40 ,line[j]);
}
this->pathFinder(len);
}
void Map :: put_enemy(Enemy e ,Cell c){
e.cor=c.cor;
e.display();
}
void Map :: put_tower(Tower t ,Cell c){
t.cor=c.cor;
t.display();
}
void Map :: remove(Cell c){
c.display();
}
void Map :: enemyMove(Enemy e){
e.cellNum+=1;
e.cor=path[e.cellNum];
}
void Map :: pathFinder(int l){
path=new pair<int ,int> [l];
ifstream infile;
infile.open(file);
char ** lines=new char* [15];
for (int i=0;i<15;i++)
infile >> lines[i];
for (int i=0;i<20;i++)
if (lines[0][i]=='0')
{
path[0]=make_pair(0,i);
break;
}
int x=0;
int y=path[0].second;
int ord=48;
for (int i=1;i<l;i++)
{
if (int(lines[x-1][y])==((ord-47)%10)+48)
x-=1;
else if (int(lines[x+1][y])==((ord-47)%10)+48)
x+=1;
else if (int(lines[x][y-1])==((ord-47)%10)+48)
y-=1;
else if (int(lines[x][y+1])==((ord-47)%10)+48)
y+=1;
path[i]=make_pair(x,y);
ord+=1;
}
}
void Map :: display(){
for (int i=0;i<15;i++)
for (int j=0;j<20;j++)
map[i][j].display();
}
//////////////////////////////////////////////////// Game ////////////////////////////////////////
class Game
{
private:
int health;
int money;
int score;
int step;
public:
Game(int ,int);
~Game();
bool End;
int enemyNum;
int towerNum;
Enemy enemys[20];
Tower towers[50];
int getHealth();
int getMoney();
int getScore();
int getStep();
void setHealth(int);
void setMoney(int);
void setScore(int);
void setStep(int);
void distroy_enemy(Enemy ,Cell);
void distroy_tower(Tower ,Cell);
void shooting(Tower);
void drag_drop(Tower);
void upgradeTower(Tower);
void buyTower(Tower);
void sellTower(Tower ,Cell);
void display(Map);
void displayMenu();
void endDisplay();
bool checkEnd();
void animation();
};
Game :: Game(int h ,int m){
health=h;
money=m;
step=1;
score=0;
enemyNum=0;
towerNum=0;
End=false;
}
int Game :: getHealth(){
return health;
}
int Game :: getMoney(){
return money;
}
int Game :: getScore(){
return score;
}
int Game :: getStep(){
return step;
}
void Game :: setHealth(int h){
health=h;
}
void Game :: setMoney(int m){
money=m;
}
void Game :: setScore(int s){
score=s;
}
void Game :: setStep (int s){
step=s;
}
void Game :: distroy_enemy(Enemy e,Cell c){
for (int i=e.index;i<enemyNum-1;i++)
enemys[i]=enemys[i+1];
enemyNum-=1;
c.display();
}
void Game :: distroy_tower(Tower t ,Cell c){
for (int i=t.index;i<towerNum-1;i++)
towers[i]=towers[i+1];
towerNum-=1;
c.display();
}
void Game :: shooting(Tower t){
for(int i=0;i<enemyNum;i++)
{
if (sqrt(pow(enemys[i].cor.first,2)+pow(enemys[i].cor.second,2)) <= t.domain)
enemys[i].health-=t.power;
}
}
void Game :: upgradeTower(Tower t){
t.upgrade();
money-=t.up_cost;
}
void Game :: buyTower(Tower t){
money-=t.price;
towers[towerNum]=t;
towerNum+=1;
t.display();
}
void Game :: sellTower(Tower t ,Cell c){
distroy_tower(t,c);
money+=t.price/2;
}
void Game :: endDisplay(){
End=true;
SDL_FillRect(surface,&surface->clip_rect,SDL_MapRGB(surface->format,0XFF,0XFF,0XFF));
SDL_Surface* text;
font=TTF_OpenFont("AV.TTF",40);
textColor.b=20;
textColor.g=10;
textColor.r=0;
if (health<=0)
{
text=TTF_RenderText_Solid(font ,"You lose" ,textColor);
}
else if (health>0)
{
text=TTF_RenderText_Solid(font ,"Complete the mission" ,textColor);
}
SDL_Rect rect;
rect.x=300;
rect.y=300;
SDL_BlitSurface(text,NULL,surface,&rect);
}
bool Game :: checkEnd(){
if (health<=0 || step==20)
return true;
return false;
}
void Game :: displayMenu(){
SDL_Rect rect;
rect.x=800;
rect.y=0;
SDL_Texture* texture = LoadTexture("menu.png");
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
void Game :: display(Map m){
m.display();
for (int i=0;i<towerNum;i++)
towers[i].display();
for (int i=0;i<enemyNum;i++)
enemys[i].display();
this->displayMenu();
/////////// ttf
}
void Game :: animation(){
SDL_Rect Lrect;
Lrect.x=83;
Lrect.y=0;
SDL_Rect Rrect;
Rrect.x=915;
Rrect.y=0;
SDL_Texture* leftpic = LoadTexture("left.png");
SDL_Texture* rightpic = LoadTexture("right.png");
for (int i=0;i<12;i++)
{
SDL_RenderCopy(renderer,leftpic,NULL,&Lrect);
SDL_RenderCopy(renderer,rightpic,NULL,&Rrect);
Rrect.x-=20;
Lrect.x+=60;
SDL_RendererFlip();
SDL_Delay(300);
}
}
////////////////////////////////////////////////////////////// main //////////////////////////////////////////////////////////////////////
int main()
{
window=SDL_CreateWindow("Frontline Defence",SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,940,600,SDL_WINDOW_SHOWN);
Game game(1000,500);
Map map("map.txt",30);
while ( !game.checkEnd() )
{
if ( SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
return 0;
if (event.type == SDL_MOUSEBUTTONDOWN )
{
SDL_Delay(3000);
}
}
}
game.endDisplay();
return 0;
}
I've done every thing I could but nothing changed!
I've tried including the libraries , typing all parts of the code in the main file and many other ways but it didn't help
These are the errors:
Error 12 error LNK1120: 8 unresolved externals C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\Debug\ConsoleApplication1.exe ConsoleApplication1
Error 4 error LNK2019: unresolved external symbol "public: __thiscall Cell::Cell(void)" (??0Cell##QAE#XZ) referenced in function "public: __thiscall Map::Map(char *,int)" (??0Map##QAE#PADH#Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 8 error LNK2019: unresolved external symbol "public: __thiscall Enemy::~Enemy(void)" (??1Enemy##QAE#XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game##QAE#HH#Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 7 error LNK2019: unresolved external symbol "public: __thiscall Enemy::Enemy(void)" (??0Enemy##QAE#XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game##QAE#HH#Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 10 error LNK2019: unresolved external symbol "public: __thiscall Game::~Game(void)" (??1Game##QAE#XZ) referenced in function "int __cdecl SDL_main(void)" (?SDL_main##YAHXZ) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 9 error LNK2019: unresolved external symbol "public: __thiscall Map::~Map(void)" (??1Map##QAE#XZ) referenced in function "int __cdecl SDL_main(void)" (?SDL_main##YAHXZ) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 6 error LNK2019: unresolved external symbol "public: __thiscall Tower::~Tower(void)" (??1Tower##QAE#XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game##QAE#HH#Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 5 error LNK2019: unresolved external symbol "public: __thiscall Tower::Tower(void)" (??0Tower##QAE#XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game##QAE#HH#Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 11 error LNK2019: unresolved external symbol _SDL_main referenced in function _main C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\SDL2main.lib(SDL_windows_main.obj) ConsoleApplication1
You're getting the linker errors referencing constructors and destructors because you haven't provided any implementation for those functions (as Michael Burr pointed out in a comment).
The unresolved external symbol _SDL_main referenced in function _main is because the mainfunction needs to have a specific signature: int main(int argc, char* argv[]) and check that you also have the SDL2main.libin the input to the linker.
Finally, it would seem that you never create any renderer (unless you create somewhere not included in your code example), so you have to add a call to SDL_CreateRenderer() after you create the SDL_Window in main.
This question already has answers here:
What is an undefined reference/unresolved external symbol error and how do I fix it?
(39 answers)
Closed 9 years ago.
I created Linked list and it has no problem and runs. Plus i have to include Binary Tree. and its giving me this error
1> Generating Code...
1> Skipping... (no relevant changes detected)
1> main.cpp
1>main.obj : error LNK2019: unresolved external symbol "public: int __thiscall SDI::BinaryTree::insert(int)" (?insert#BinaryTree#SDI##QAEHH#Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: int __thiscall SDI::BinaryTree::preOrder(void)" (?preOrder#BinaryTree#SDI##QAEHXZ) referenced in function _main
1>C:\Users\Muugii\Documents\Visual Studio 2013\LinkedList\Debug\LinkedList.exe : fatal error LNK1120: 2 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
BinaryTree.h
ifndef SDI_BINARYTREE
define SDI_BINARYTREE
include
namespace SDI
{
class BinaryTree
{
class BTNode
{
public:
int data;
BTNode *left;
BTNode *right;
};
public:
BinaryTree();
~BinaryTree();
int insert(const int value);
int preOrder() const;
int clearTree();
private:
BTNode *headPtr;
int insert(const int value, BTNode *leaf);
int clearTree(BTNode *leaf) const;
int preOrder(BTNode *leaf) const;
};
};
#endif
BinaryTree.cpp
#include"BinaryTree.h"
#include <iostream>
using namespace std;
SDI::BinaryTree::BinaryTree()
{
headPtr = nullptr;
}
SDI::BinaryTree::~BinaryTree()
{
//clearTree(headPtr);
}
int SDI::BinaryTree::insert(const int value, BTNode *leaf)
{
if (value < leaf->data)
{
if (leaf->left != nullptr)
{
insert(value, leaf->left);
}
else
{
leaf->left = new BTNode;
leaf->left->data = value;
leaf->left->left = nullptr;
leaf->left->right = nullptr;
}
}
else if (value >= leaf->data)
{
if (leaf->right != nullptr)
{
insert(value, leaf->right);
}
else
{
leaf->right = new BTNode;
leaf->right->data = value;
leaf->right->left = nullptr;
leaf->right->right = nullptr;
}
}
return 1;
}
Main.cpp
#include <string>
#include <iostream>
#include "Linkedlist.h"
#include "BinaryTree.h"
using namespace std;
int main( int argc, const char *argv[])
{
SDI::LinkedList myList;
//SDI::BinaryTree myTree;
int inp;
....
if (inp2 == 'a')
{
int num;
cout << "\nPlease enter a value to add: ";
cin >> num;
myTree.insert(num);
cout << "\n\t\tValue has been successfully saved\n\n\n";
}
I have tried looking up online, couldn't find any. It would be great help.
As I see you have two functions with name insert. And the first one
int insert(const int value);
was only declared but not defined.
Which part of the error message is unclear to you? It clearly states that you haven't implemented two of your methods:
int SDI::BinaryTree::insert(const int value) {
return 0; // the implementation probably needs some patching up
}
int SDI::BinaryTree::preOrder() const {
return 0; // as does this one
}
I am working on an assignment for implementing queue functionality using only 2 stacks. I have the idea and the code down completely as far as I know but I am getting this error. From what I've looked at it is because there are multiple declarations for 1 variable that occur in the various .cpp files. I do not understand this error very well. My only guess is that I have a function for stack called "empty" and I have a similar function in queue by the same name. Could someone please explain to me where I am going wrong? Thanks for any help!
My code
EDIT:
Exact error message:
SQueueMain.obj : error LNK2005: "public: __thiscall Stack::Stack(void)" (??0Stack##QAE#XZ) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: __thiscall Stack::Stack(class Stack const &)" (??0Stack##QAE#ABV0##Z) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: __thiscall Stack::~Stack(void)" (??1Stack##QAE#XZ) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: class Stack const & __thiscall Stack::operator=(class Stack const &)" (??4Stack##QAEABV0#ABV0##Z) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: bool __thiscall Stack::empty(void)const " (?empty#Stack##QBE_NXZ) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: void __thiscall Stack::push(int const &)" (?push#Stack##QAEXABH#Z) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: void __thiscall Stack::display(class std::basic_ostream<char,struct std::char_traits<char> > &)const " (?display#Stack##QBEXAAV?$basic_ostream#DU?$char_traits#D#std###std###Z) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: int __thiscall Stack::top(void)const " (?top#Stack##QBEHXZ) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: void __thiscall Stack::pop(void)" (?pop#Stack##QAEXXZ) already defined in LStack.obj
SQueueMain.obj : error LNK2005: "public: __thiscall queue::queue(void)" (??0queue##QAE#XZ) already defined in SQueue.obj
SQueueMain.obj : error LNK2005: "public: __thiscall queue::~queue(void)" (??1queue##QAE#XZ) already defined in SQueue.obj
SQueueMain.obj : error LNK2005: "public: void __thiscall queue::enqueue(int)" (?enqueue#queue##QAEXH#Z) already defined in SQueue.obj
SQueueMain.obj : error LNK2005: "public: void __thiscall queue::dequeue(void)" (?dequeue#queue##QAEXXZ) already defined in SQueue.obj
SQueueMain.obj : error LNK2005: "public: int __thiscall queue::front(void)" (?front#queue##QAEHXZ) already defined in SQueue.obj
SQueueMain.obj : error LNK2005: "public: bool __thiscall queue::empty(void)" (?empty#queue##QAE_NXZ) already defined in SQueue.obj
SQueueMain.obj : error LNK2005: "private: class Stack::Node * __thiscall queue::setFront(void)" (?setFront#queue##AAEPAVNode#Stack##XZ) already defined in SQueue.obj
SQueueMain.cpp
//SQueueMain.cpp starts here---------------------------------------
#include "SQueue.cpp"
int main()
{
queue queue1;
int switchNum, tempNum;
while (1)
{
cout << "What action would you like to perform? \n";
cout << "Please enter the number that corresponds with the correct action. \n";
cout << "0: Enqueue an item. \n";
cout << "1: Dequeue an item. \n";
cout << "2: Return the front value. \n";
cout << "3: Determine if the queue is empty. \n";
cout << "4: Exit the program. \n";
cin >> switchNum;
switch (switchNum)
{
case 0:
{
cout << "What is the value you wish to enqueue? \n";
cin >> tempNum;
queue1.enqueue(tempNum);
}
break;
case 1:
{
queue1.dequeue();
}
break;
case 2:
{
cout << queue1.front();
}
break;
case 3:
{
cout << queue1.empty();
}
break;
case 4:
{
return 0;
}
}
}
}
//SQueueMain.cpp ends here-----------------------------------------
SQueue.cpp
//SQueue.cpp starts here---------------------------------------------------
#include "SQueue.h"
#include <new>
using namespace std;
queue::queue() : myFront(0) {}
queue::~queue()
{
queue::s1.~Stack();
queue::s2.~Stack();
}
void queue::enqueue(int num)
{
queue::s1.push(num);
}
void queue::dequeue()
{
queue::setFront();
queue::s2.pop();
}
queueElement queue::front()
{
queue::setFront();
if (!empty())
return (myFront->data);
else
{
cerr << "*** Queue is empty -- returing garbage ***\n";
return *(new queueElement);
}
}
bool queue::empty()
{
queue::setFront();
return (myFront == 0);
}
Stack::NodePointer queue::setFront()
{
int temp;
if (queue::s2.empty() == true)
{
while (queue::s1.empty() != true)
{
temp = queue::s1.myTop->data;
queue::s1.pop();
queue::s2.push(temp);
}
}
myFront = queue::s2.myTop;
return myFront;
}
//SQueue.cpp ends here---------------------------------------------------
SQueue.h
//SQueue.h starts here-------------------------------------------------------------
#include <iostream>
#include "LSTack.cpp"
using namespace std;
#ifndef SQUEUE
#define SQUEUE
typedef int queueElement;
class queue
{
public:
Stack s1, s2;
queue();
~queue();
void enqueue(int);
void dequeue();
queueElement front();
bool empty();
Stack::NodePointer myFront; //typedef from LStack.h
private:
Stack::NodePointer setFront();
};
#endif
//SQueue.h ends here--------------------------------------------------------------
LStack.cpp
//--- LStack.cpp -------------------------------------------------
#include <new>
using namespace std;
#include "LStack.h"
//--- Definition of Stack constructor
Stack::Stack(): myTop(0){}
//--- Definition of Stack copy constructor
Stack::Stack(const Stack & original)
{
myTop = 0;
if (!original.empty())
{
// Copy first node
myTop = new Stack::Node(original.top());
// Set pointers to run through the stack's linked lists
Stack::NodePointer lastPtr = myTop,
origPtr = original.myTop->next;
while (origPtr != 0)
{
lastPtr->next = new Stack::Node(origPtr->data);
lastPtr = lastPtr->next;
origPtr = origPtr->next;
}
}
}
//--- Definition of Stack destructor
Stack::~Stack()
{
// Set pointers to run through the stack
Stack::NodePointer currPtr = myTop, // node to be deallocated
nextPtr; // its successor
while (currPtr != 0)
{
nextPtr = currPtr->next;
delete currPtr;
currPtr = nextPtr;
}
}
//--- Definition of assignment operator
const Stack & Stack::operator=(const Stack & rightHandSide)
{
myTop = 0;
if (rightHandSide.empty()) return *this;
if (this != & rightHandSide) // check that not st = st
{
this->~Stack(); // destroy current linked list
// Copy first node
myTop = new Stack::Node(rightHandSide.top());
// Set pointers to run through the stacks' linked lists
Stack::NodePointer lastPtr = myTop,
rhsPtr = rightHandSide.myTop->next;
while (rhsPtr != 0)
{
lastPtr->next = new Stack::Node(rhsPtr->data);
lastPtr = lastPtr->next;
rhsPtr = rhsPtr->next;
}
}
return *this;
}
//--- Definition of empty()
bool Stack::empty() const
{
return (myTop == 0);
}
//--- Definition of push()
void Stack::push(const StackElement & value)
{
myTop = new Stack::Node(value, myTop);
}
//--- Definition of display()
void Stack::display(ostream & out) const
{
Stack::NodePointer ptr;
for (ptr = myTop; ptr != 0; ptr = ptr->next)
out << ptr->data << endl;
}
//--- Definition of top()
StackElement Stack::top() const
{
if (!empty())
return (myTop->data);
else
{
cerr << "*** Stack is empty "
" -- returning garbage ***\n";
return *(new StackElement); // "Garbage" value
}
}
//--- Definition of pop()
void Stack::pop()
{
if (!empty())
{
Stack::NodePointer ptr = myTop;
myTop = myTop->next;
delete ptr;
}
else
cerr << "*** Stack is empty -- can't remove a value ***\n";
}
LStack.h
#include <iostream>
using namespace std;
#ifndef LSTACK
#define LSTACK
typedef int StackElement;
class Stack
{
friend class queue;
public:
Stack();
Stack(const Stack & original);
~Stack();
const Stack & operator = (const Stack & rightHandSide);
bool empty() const;
void push(const StackElement & value);
void display(ostream & out) const;
StackElement top() const;
void pop();
/***** Function Members *****/
// Prototypes same as in preceding section
private:
/*** Node class ***/
class Node
{
public:
StackElement data;
Node * next;
//--- Node constructor
Node(StackElement value, Node * link = 0)
/*------------------------------------------------------
Precondition: value is received
Postcondition: A Node has been constructed with value
in its data part and itb next part set to link
(default 0).
------------------------------------------------------*/
{ data = value; next = link; }
};
typedef Node * NodePointer;
/***** Data Members *****/
NodePointer myTop; // pointer to top of stack
}; // end of class declaration
#endif
#include "SQueue.cpp" // KILL THIS or exclude SQueue.cpp in compilation process