Re: Copy Constructors and Assignment Operator, When should I use?
Here is my compiled and worked code
It works as you guys suggested. I do not need to write my own copy
cctor as my class contains only std::string, vector and time_t. And
the compiler provides the copy cctor for these data types.
This is my testing code, in my real code, I have 12 classes like
ItemListA, and when I call the removeFstItem function, I got the
error
"Microsoft visual studio C runtime library has detected a fatal error
in myappl.exe"
Now I suspect that since I erase the item from the vector may cause
the iterator read an invalid memory. (the following code shows the
removeFstItem, but in my real removeItem, I find the item based on the
key and then erase , so the item could be at any place, maybe this
cause my problem.) As when I try to debug, Microsoft visual studio
2005 always direct me to the removeFstItem of another class, which
cause the big discussion and confusing of "do I need the copy cctor
for my classes?
thanks for everybody help me to clearify this.
--------------------
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
struct ItemA{
int aInt;
std::string aString;
} ;
struct ItemB{
int bInt;
std::string bString;
time_t bTime;
} ;
class ItemListA{
std::vector <ItemA> m_vecA;
public:
void load(){
ItemA a;
a.aInt = 1;
a.aString = "ITEM A 1";
m_vecA.push_back(a);
a.aInt = 2;
a.aString = "ITEM A 2";
m_vecA.push_back(a);
}
void removeFstItem(){
std::vector<ItemA>::iterator vecItr;
for(vecItr = m_vecA.begin();
vecItr != m_vecA.end();
++vecItr){
if(vecItr->aInt == 1){
m_vecA.erase(vecItr);
return;
}
}
}
void writeout(){
std::vector<ItemA>::iterator vecItr;
cout << ">>>>>>>>>>>>item List A>>>>>>>>>>>>\n";
for(vecItr = m_vecA.begin();
vecItr != m_vecA.end();
++vecItr){
cout << "-----------item A ---------------\n";
cout << vecItr->aInt;
cout << "\n";
cout << vecItr->aString.c_str();
cout << "\n";
}
}
};
class ItemListB{
std::vector <ItemB> m_vecB;
public:
void load(){
ItemB b;
b.bInt = 1;
b.bString = "Item B 1";
b.bTime = time_t(NULL);
m_vecB.push_back(b);
b.bInt = 2;
b.bString = "Item B 2";
b.bTime = time_t(NULL);
m_vecB.push_back(b);
}
void removeFstItem(){
std::vector<ItemB>::iterator vecItr;
for(vecItr = m_vecB.begin();
vecItr != m_vecB.end();
++vecItr){
if(vecItr->bInt == 1){
m_vecB.erase(vecItr);
return;
}
}
}
void writeout(){
std::vector<ItemB>::iterator vecItr;
cout << ">>>>>>>>>>>>item List B>>>>>>>>>>>>\n";
for(vecItr = m_vecB.begin();
vecItr != m_vecB.end();
++vecItr){
cout << "------------item B--------------\n";
cout << vecItr->bInt;
cout << "\n";
cout << vecItr->bString.c_str();
cout << "\n";
cout << vecItr->bTime;
cout << "\n";
}
}
};
class ItemSet{
ItemListA a;
ItemListB b;
public:
void load(){
a.load();
b.load();
}
void removeFstItem(){
a.removeFstItem();
b.removeFstItem();
}
void writeout(){
a.writeout();
b.writeout();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
ItemSet* p_set1 = new ItemSet();
p_set1->load();
ItemSet set2 = (*p_set1);
cout << "***************set1 init************\n";
p_set1->writeout();
p_set1->removeFstItem();
cout << "***************set1 remove fst************\n";
p_set1->writeout();
cout << "***************set2 assigned************\n";
set2.writeout();
delete p_set1;
return 0;
}
---------------------------------------