указатель на экземпляр класса, содержащий вектор <int>проблему - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть такой класс:

class largeInt{
  vector<int> myVector;
  largeInt  operator*  (const largeInt &arg);

}

в моем основном я не могу избежать копий при работе с указателями:

void main(){

    //this works but there are multiple copies: I return a copy of the calculated
    //largeInt from the multiplication and then i create a new largeInt from that copy.
    largeInt testNum = 10;
    largeInt *pNum = new HugeInt( testNum*10);

    //i think this code avoid one copy but at the end hI points to a largeInt that has
    // myVector = 0 (seems to be a new instance = 0 ). With simple ints this works  great.
    largeInt i = 10;
    largeInt *hI;
    hI = &(i*10);

}

Я думаю, что я скучаю / нетуправлять чем-то в векторном дизайне. Могу ли я получить указатель без копирования, даже не создавая новый largeInt?Спасибо экспертам!

1 Ответ

1 голос
/ 16 апреля 2011

hI = &(i*10); принимает адрес временного largeInt, который уничтожается сразу после ';'- поэтому hI указывает на недопустимую память.

Когда вы умножаете два largeInt, вы делаете , получаете новый экземпляр - это то, что делает умножение.Возможно, вы намеревались сделать operator*= вместо этого?Это должно изменить существующий экземпляр, а не создавать новый.

Обратите внимание:

int L = 3, R = 5;

int j = L*R; // You *want* a new instance - L and R shouldn't change
L*=R; // You don't want a new instance - L is modified, R is unchanged

Кроме того, вы не должны использовать new для создания largeInt в куче - просто сделайте так:

largeInt i = 10; 
largeInt hi = i*10; // Create a temporary, copy construct from the temporary

Или:

largeInt i = 10;
largeInt hi = i; // Copy construction
hi *= 10; // Modify hi directly
...