Я написал следующий демонстрационный код, чтобы изучить конструктор копирования и оператор присваивания. Однако есть небольшая путаница. Мне сказали удалить указатели в операторе присваивания и выделить новый адрес для data
. Однако я могу только заставить свой код работать, удаляя эту строку. Я взял это в качестве ссылки, но она показывает только пример int, а не int*
. Как я могу решить эту проблему?
#include <iostream>
#include <string>
#include <vector>
#include <random>
#include <boost/smart_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace boost;
class ClassOne
{
public:
ClassOne():data(NULL) {}
ClassOne(int data_param):data(NULL)
{
init(data_param);
std::cout << "construct" << std::endl;
}
virtual ~ClassOne()
{
if (data) {
delete data;
}
data = NULL;
}
ClassOne(const ClassOne& rhs){
std::cout<< "copy " <<std::endl;
data = NULL;
init(*rhs.data);
}
ClassOne& operator = (const ClassOne& rhs){
std::cout<< "assign " <<std::endl;
int* p_old = rhs.data;
data = new int(*p_old);
//delete p_old; // I have to delete this line to make my code work
return *this;
}
void init(int data_param)
{
if (data) {
delete data;
}
data = new int(data_param);
}
private:
int* data;
};
int main(int argc, const char * argv[]) {
ClassOne c1(10);
ClassOne c2(c1); // call copy constructor
ClassOne c3;
c3 = c1; // call assignment function
return 0;
}
int* p_old = rhs.data;
должно бытьint* p_old = data;
- person πάντα ῥεῖ   schedule 05.01.2016delete
для указателяNULL
( т. е. вам не нужно делатьif (data)
перед вызовомdelete
). - person James Adkison   schedule 05.01.2016data = new int(*p_old);
должно бытьdata = new int(*rhs.data);
- person πάντα ῥεῖ   schedule 05.01.2016a = b
, вы ожидаете, чтоb
будет изменено? - person Some programmer dude   schedule 05.01.2016