splincodewd
@splincodewd
Developer

Как запретить копирования указателей?

#include <iostream>
using namespace std;


class Number {

    float* val;
    void operator = (const Number&); // не помогает
    
public:

    Number(float arg){
       val = new float(arg);
    }

    float& get(){
        return *val;
    }

    ~Number(){
        delete val;
    }
};

int main(int argc, char *argv[]){

        Number* a = new Number(1);
        Number* b = new Number(2);

        a = b; // утечка памяти
        // a будет указывать на b
        // теперь мы не знаем ссылку на область a



        cout << a->get() << endl;
        cout << b->get() << endl;

        cout << a->get() / b->get() << endl;

       delete a;
       delete b; // invalid pointer, программа падает


    return 0;
}


Как сделать так, чтобы нельзя было присвоить a и b. Перегрузка присваивания в private-секции не помогает, она сработает только, когда мы по значению будем присваивать *a = *b и тогда компилятор предупредит о такой ошибке.

1e31dc5525d04f3b8e0524fb4e18301c.png
  • Вопрос задан
  • 192 просмотра
Решения вопроса 2
например unique_ptr , на текущий момент возможно есть лучше альтернатива
Ответ написан
Number* const a = new Number(1);
Number* const b = new Number(2);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Alexander1705
Реализуйте оператор присваивания:
// Так, если хотите, чтоб они указывали на одну область:
Number& operator = (const Number& other)
{
    delete val;
    this->val = other.val;
    return *this;
}

// Так, если должна создаваться копия значения:
Number& operator = (const Number& other)
{
    delete val;
    this->val = new float(*(other.val));
    return *this;
}

P. S. operator= должен возвращать ссылку на левый операнд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы