что / можно / вы возвращаете из функции ... и ожидаете ли она, что она будет жива по прибытии? - PullRequest
0 голосов
/ 17 января 2020

Еще раз я понял, что функция должна возвращать правильное значение, а затем разочаровываться ... получая странное поведение и вводя в заблуждение информацию отладки. Хорошо известно, что вы не можете вернуть локальную переменную из функции и ожидать, что она прибудет так, как вы ожидаете. Тестирование

int i=2;
int k=4;
return make_pair<int,int>(i*i,k*k);

Действительно ли возвращает что-то респектабельное. Но использование более сложных объектов, чем простые типы, кажется, ловит меня каждый раз . Итак, есть ли формальность, которую я могу использовать для различения того, что можно, а что нельзя безопасно вернуть из функции? ----------- добавлено при редактировании: ------------ Вот пример, который не работает, зверски вырван из контекста. Проблемный контекст - это (должно быть GUI) дерево прямоугольников для экрана. Узел класса наследуется от базы (прямоугольника), содержащей 3 указателя, на простые типы (опять же, используется для привязки значений). База использует конструктор new в конструкторе

pair<node,node> node_handler::split( vector<node>::iterator& this_node, double ratio, bool as_horizontal ){
//this_node becomes parents to the split-twins
    this_node->my_ratio=ratio;
    double firstW, firstH;
    double secW, secH;
    glm::dvec2 afirst, asecond;
    if(as_horizontal ){
        firstW = *this_node->plWidth*LETTER_PIXEL_WIDTH;
        firstH = *this_node->plHeight*LINE_PIXEL_HEIGHT*ratio;
        afirst = *this_node->pPoint;
        secW   = firstW;
        secH   = LINE_PIXEL_HEIGHT*(*this_node->plHeight)*(1.0d-ratio);
        asecond= afirst+glm::dvec2(0.0d, firstH);
    }
    else{
        firstW = ratio*(*this_node->plWidth)*LETTER_PIXEL_WIDTH;
        firstH = *this_node->plHeight*LINE_PIXEL_HEIGHT;
        afirst = *this_node->pPoint;
        secW   = (1.0d*ratio)*(*this_node->plWidth)*LETTER_PIXEL_WIDTH;
        secH   = firstH;
        asecond= afirst+glm::dvec2(firstW,0.0d);
    }
    return make_pair<node,node>( node(afirst ,firstW, firstH) , node(asecond ,secW, secH)  ) ;
}

Ответы [ 2 ]

1 голос
/ 17 января 2020

Технически, вы можете вернуть что-нибудь из функции.

Теперь, когда вы возвращаете указатель или ссылку на что-то только локальное, у вас возникает проблема.

Решения:

  1. Возвращать копии (в любом случае, с разрешением на копирование) * печатает и передает в функцию ссылку на объект, который может быть изменен.

Не создавайте в функции что-то, что требует уничтожения слоя вручную (например, указатель, созданный с помощью new ).

0 голосов
/ 17 января 2020

До меня дошло, что классы, содержащие указатели-члены, должны иметь собственные операторы копирования / присваивания. Мне никогда не приходилось вникать в переменную «rho», о которой говорится в книгах, которые я читал в то время… «right_hand_object», должно быть! Это моё прозрение. Это следовало за бизнесом конструкторов и вашими разговорами о копируемых объектах, которые использовали мою старую проблему ро. Прошу прощения за то, что распространил мое разочарование на вас.

...