Связанные списки | Перегрузка + оператор | C ++ - PullRequest
4 голосов
/ 06 марта 2012

Я тренирую свой C ++ и пытаюсь написать библиотеку, которая сможет представлять следующее число, используя связанные списки:

999999999 * ([i = 0] Σ [999999999] 1000000000 ^ i)

Например, если мой номер был 711381450277869054011 , он будет представлен следующим образом:

711 * 1000000000 ^ 2 + 381450277 * 1000000000 ^ 1 + 869054011 * 1000000000 ^ 0

Итак, вот структура моего LL и его функции:

typedef struct node* ll;
struct node
{
    unsigned int data;
    ll next;
};

bool insert(ll&, unsigned int);
// ...
void copy(ll&, ll);
void destroy(ll&);

А вот мой класс беззнаковых очень длинных целых чисел:

class uli
{
public:
    uli();
    ~uli();

    // <<, >>, =, operators...

    uli& operator +=(const uli&);
    uli& operator +=(char*);
    const uli operator +(const uli&);

private:
    ll head;
};

uli::uli()
{
    head = NULL;

    insert(head, 0);
}

uli::~uli()
{
    destroy(head);
}

+ = оператор работает нормально, и я использую его для перегрузки оператора + .

Проблема в том, что я не могу заставить метод operator + () вернуть const uli без его разрушения деконструктором до того, как я его использую.

const uli uli::operator +(const uli& rarg) // rarg: right argument
{
    uli larg; // left argument

    larg = *this;

    larg += rarg;

    return larg;
}
// returns an LL to somewhere ???? larg was destroyed.

Теперь я не могу сделать Z = X + Y;

1 Ответ

6 голосов
/ 06 марта 2012

Вы должны следовать правилу трех ,

Если вашему классу требуется либо

  • конструктор копирования,
  • оператор присваивания,
  • или деструктор,

тогда, вероятно, понадобятся все три из них.

Root Причина ваших проблем:
В вашем случае, когда вы возвращаете экземпляр класса uli путем копирования из перегруженного operator +, используется созданный компилятором неявный конструктор копирования, и он делает поверхностную копию вашегоуказатели, таким образом, несколько указателей указывают на один и тот же адрес памяти, и когда один / некоторые из них (временные объекты) уничтожаются, указанная на память освобождается через деструктор, и другие указатели (висящие) указывают на несуществующую память / контент,

Решение:
Следуйте правилу трех и реализуйте свой собственный конструктор копирования для выполнения Глубокого копирования задействованных указателей.

...