Проблема в том, что ваш класс содержит указатель.
Реальный код очень редко должен содержать OWNED
указатели.Они обычно заключены в некоторый служебный класс (например, интеллектуальный указатель или контейнер) или, чаще всего, это простые объекты.
Ваш код должен выглядеть следующим образом:
class Sample
{
public:
int val; // No need to make it a pointer
Sample(int i)
: val(i)
{}
void PrintVal()
{ cout << "The value is " << val;
}
};
Если вам нужнодинамически размещенный объект, тогда он должен быть в интеллектуальном указателе (если вы хотите использовать общий ресурс, тогда он выглядит следующим образом.
class Sample
{
public:
std::shared_ptr<int> ptr;
Sample(int i)
:ptr(new int(i))
{}
void PrintVal()
{
cout << "The value is " << *ptr;
}
};
Предполагается, что вы пишете свою собственную оболочку указателя (плохая идея), но давайте предположим,это для практики с указателями. Тогда вам нужно подчиниться правилу 3. Это потому, что сгенерированные компилятором версии copy constructor
и assignment operator
не будут работать правильно для OWNED RAW указателей. OWNED RAW Указатель - это указатель, которым вы владеете и, таким образом, отвечаете за удаление.
Существует два решения этой проблемы. Сделайте конструктор копирования и операторы назначения частными. Это остановит вашкод работает, поэтому я предполагаю, что это не то, что вам нужно. Поэтому нам нужно заставить их работать. Так как общий случай описан выше в std:: shared_ptr <> здесь мы рассмотрим случай совместного использования копий.
class Sample
{
public:
int *ptr; // OWNED RAW POINTER
Sample(int i)
: ptr(new int(i))
{}
~Sample()
{
delete ptr;
}
Simple(Simple const& copy)
: ptr(new int (*(copy.ptr)))
{}
Simple& operator=(Simple rhs) // Assignment uses the copy and swap idium.
{ // Notice the parameter is passed by value to get
std::swap(ptr, rhs.ptr); // an implicit copy using the copy constructor.
} // Then we simply swap the pointers. The copy will be
// destroyed with the old pointer.
void PrintVal()
{
cout << "The value is " << *ptr;
}
};