2013-04-11 218 views
0

OOP(即C程序员转换为C++)有点新鲜,并且无法弄清楚为什么我的背包类中的数据成员是空的。我把一些药水传给我的背包,但数据成员说mType =“”(即没有)。复制构造函数不工作?

我从来没有觉得这个在程序中迷失了。开始讨厌OOP(即开玩笑......但这非常令人沮丧)。

的main.cpp

#include <iostream> 
#include "rogue.h" 
#include "weapon.h" 
#include "backpack.h" 
#include "potion.h" 
#include "coinpouch.h" 

int main() 
{ 
Potion myFavoritePotions[5]; 
myFavoritePotions[0].setName("love"); 
myFavoritePotions[1].setName("hate"); 
myFavoritePotions[2].setName("shrink"); 
myFavoritePotions[3].setName("grow"); 
myFavoritePotions[4].setName("disappear"); 
BackPack myFavoriteBackPack(myFavoritePotions); 
Weapon myFavoriteWeapon("AK-47"); 
Weapon mySecretWeapon("Me-262"); 
Weapon myLeastFavoriteWeapon("Luger"); 
CoinPouch myFavoritePurse(6,5,4,3); 
Rogue myFavoriteRogue("Cynic", myFavoriteWeapon, mySecretWeapon, myFavoriteBackPack, myFavoritePurse); 

mySecretWeapon = myFavoriteWeapon; 

myFavoriteRogue.setOffHand(myLeastFavoriteWeapon); 
//std::cout << myFavoriteRogue.getOffHand(); 

return 0; 
} 

potion.cpp

#include <iostream> 
#include "potion.h" 

//Manager function definitions 

//Default constructor 
Potion::Potion() 
{} 

//Constructor 
Potion::Potion(std::string name) 
:mName(name) 
{ 
std::cout << "Potion's constructor " << std::endl; 
} 

//Destructor 
Potion::~Potion() 
{ 
std::cout << "Potion's destructor " << std::endl; 
} 

//Copy constructor 
Potion::Potion(const Potion & copy) 
{ 
std::cout << "Potion's copy constructor " << std::endl; 
} 

//Overloaded assignment operator 
Potion &Potion::operator= (const Potion & rhs) 
{ 
std::cout << "Potion's overloaded assignment operator. " << std::endl; 

return *this; 
} 

//Setters 
void Potion::setName(std::string name) 
{ 
mName = name; 
} 

//Getters 
std::string Potion::getName() 
{ 
return mName; 
} 

backpack.cpp

#include <iostream> 
#include "backpack.h" 

//Manager function definitions 

//Default constructor 
BackPack::BackPack() 
{} 

//Constructor 
BackPack::BackPack(Potion Potions[]) 
{ 
for(int i = 0; i < 5; i++) 
{ 
    mPotions[i] = Potions[i]; 
} 
std::cout << "Backpack's constructor. " << std::endl; 
} 

//Destructor 
BackPack::~BackPack() 
{ 
std::cout << "Backpack's destructor. " << std::endl; 
} 

//Copy constructor 
BackPack::BackPack(const BackPack & copy) 
{ 
std::cout << "Backpack's copy constructor. " << std::endl; 
} 

//Overloaded assignment operator 
BackPack &BackPack::operator=(const BackPack & rhs) 
{ 
std::cout << "Backpack's assignment operator. " << std::endl; 

return *this; 
} 

//Setters 
void BackPack::setPotion(Potion Potions[]) 
{ 
for(int i = 0; i < 5; i++) 
{ 
    mPotions[i] = Potions[i]; 
} 
} 

//Getters 
Potion * BackPack::getPotion() 
{ 
Potion * potionPointer = mPotions; 
return potionPointer; 
} 
+0

尝试将副本中的字段复制到此目录中。 – 2013-04-11 06:49:46

回答

4

如果implemen t复制构造函数和复制赋值运算符,那么你实际上必须实现的复制。它不会为你做。

7

你的拷贝构造函数不进行任何复制:

//Copy constructor 
BackPack::BackPack(const BackPack & copy) 
{ 
std::cout << "Backpack's copy constructor. " << std::endl; 
} 

也不做你的拷贝赋值运算符:

//Overloaded assignment operator 
BackPack &BackPack::operator=(const BackPack & rhs) 
{ 
std::cout << "Backpack's assignment operator. " << std::endl; 

return *this; 
} 

一旦你提供自己的拷贝构造函数和拷贝赋值运算符,反编译生成的被压制。如果你需要做一些复制,你必须实现它。

(这当然适用于所有类。)

2

当调用拷贝构造函数,你当然必须将值赋给待创建的对象...

Potion::Potion(const Potion & copy) 
{ 
    //assign the elements from copy to your object here 
    std::cout << "Potion's copy constructor " << std::endl; 
} 

复制构造函数不会为您执行此操作。