Установка членов класса в функции с локальными переменными - PullRequest
1 голос
/ 30 марта 2020

Привет, у меня есть этот пример.

class Test
{
public:
    Test(){m_x = 0;};
    ~Test() {};
    void setX(const int x) {m_x=x;}
    int getX() const {return m_x;}
private:
    int m_x;
};

void SetX(Test& test)
{
    int x = 2;
    test.setX(x);
}

int main()
{
    Test X;
    SetX(X);
    std::cout << "XX: " << X.getX() << std::endl;
return 0;
}

Допустимо ли устанавливать переменную-член класса, как это, или это случайное поведение, когда int x = 2 выходит из области видимости ?! Спасибо за помощь это будет неопределенное поведение ?! Это зависит от того, использует ли AnotherCLass внутренне ссылку или указатель на AnotherClassRessource, не так ли? Спасибо за вашу помощь

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Да, ваш код верен, вот пошаговое описание того, что происходит в вашей SetX(...) функции

void SetX(Test& test)
{ // Start a scope
    int x = 2;    // Create a local variable on the stack named x, set it's value to 2
    test.setX(x); // Pass the local variable by value (does a copy) to the member function setX(...)
} // Deallocate stack variables in this scope (local variable x deallocated here)

Итак, в итоге вашей локальной переменной x перед присвоением значения (2) передается по значению в setX(...) в качестве аргумента, что означает, что значение x копируется в переменную параметра x в этом коде:

void setX(const int x) {m_x=x;}

Решение вашей проблемы: Что не сработало бы, если бы ваша setX(...) функция-член взяла и сохранила ссылку на целое число, а не на значение. Это будет означать, что ссылка на освобожденную переменную стека может быть сохранена в вашем классе (несмотря на то, что она больше не существует).

class Test
{
public:
    void setX(int& x) {m_x=x;} // Notice the & for reference
...
private:
    int& m_x; // Notice the & for reference
}
0 голосов
/ 30 марта 2020

Если я не пропускаю что-то, ваш код должен быть действительным. Вам нужно беспокоиться только о переменных, которые go выходят из области видимости, если вы храните ссылку или указатель на них.

Однако, поскольку m_x определяется как int, а не как int& или int*, вы создаете копию в своем методе класса setX при использовании m_x=x;

Так что после того, как ваша функция вернется, значение уже сохранено в вашем классе, и все в порядке.

0 голосов
/ 30 марта 2020

Определенно допустимо, хотя и немного избыточно, иметь метод для установки переменной и затем функцию, которая вызывает метод.

edit: Вы, вероятно, спрашиваете, сохраняет ли экземпляр вашего класса значение Вы назначаете это в своей функции. Это также верно, поскольку вы передаете экземпляр по ссылке.

...