Перебулировать переменную, отправленную по ссылке

это мой код

void SMatrix::pow(int power, SMatrix & result)
{
if (this->rowSize != this->colSize || this->rowSize != result.rowSize || this->colSize != result.colSize || power <= 0)
{
delete & result;
result = new SMatrix (result.rowSize, result.colSize);
}
}

Я пытаюсь удалить этот результат в этом случае, и отправить его как новый SMatrix, Как мне это сделать? (reuslt = newM….. спроси меня SMatrix *, но это не работает с &).

В основном я могу построить это так:
SMatrix * s = новый SMatrix (4, 4);
или же
SMatrix s (4, 4);
(указатель или нет).

0

Решение

Этот код просто «делает это неправильно».

Если у вас есть ссылочный аргумент, то подразумевается, что владение любым указателем на него принадлежит вызывающей стороне.

void SMatrix::pow(int power, SMatrix & result)
{
if (this->rowSize != this->colSize || this->rowSize != result.rowSize || this->colSize != result.colSize || power <= 0)
{
delete & result;
result = new SMatrix (result.rowSize, result.colSize);
}
}

Если твой SMatrix не имеет надлежащего operator=тогда у тебя должен быть один. Другими словами, правильная вещь должна произойти, если вы делаете:

        if (rowSize != colSize || rowSize != result.rowSize || colSize != result.colSize || power <= 0)
{
result = SMatrix (result.rowSize, result.colSize);
}

(Обратите внимание, что я удалил оба delete линия и new оператор)

Если по какой-то причине это не будет работать правильно, вам нужно это исправить, а не полагаться на то, как были распределены оригинальные данные.

4

Другие решения

        delete & result;
result = new SMatrix (result.rowSize, result.colSize);

Ты не можешь delete объект, а затем вызвать operator= в теме. Вы делаете эквивалент этого:

std::string* j = new std::string ("hello");
delete j;
*j = "goodbye"; // Oops, there's no string whose value we can set

Я думаю, что вы, вероятно, просто хотите result = SMatrix (result.rowSize, result.colSize);, Вы хотите изменить значение resultВы не хотите удалять или создавать что-либо динамическое.

2

По вопросам рекламы [email protected]