Как сохранить состояние объекта без использования глобальных переменных в c ++ - PullRequest
3 голосов
/ 06 августа 2011

Я новичок в C ++, и во время обучения я сталкивался с множеством мест, в которых говорится, что следует избегать использования глобальных переменных и использовать их в очень редких случаях.

Мой вопрос: как я могу сохранить состояние объекта, чтобы к нему можно было получить доступ позже, без использования глобальных переменных? Вот пример:

Класс Circle может хранить свое состояние, используя диаметр, x и y в качестве глобальных. Затем эти значения можно изменить и получить с помощью методов.

Есть ли способ выполнить вышесказанное без использования глобальных переменных, которые предпочтительнее?

Спасибо

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

Ответы [ 3 ]

4 голосов
/ 06 августа 2011

Обычно вы сохраняете состояние объекта, используя переменные-члены.

class Circle
{
   ...
private:
   double x, y;
   double diameter;
};

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

3 голосов
/ 06 августа 2011

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

Сделать переменные состояния member переменными, чтобы у каждого экземпляра класса была своя собственная версия. Это один из принципов объектно-ориентированного программирования.

Если у вас есть переменные, которые должны быть общими для всех экземпляров класса , сделайте их статическими переменными-членами . Таким образом, вы знаете, что только ваши объекты могут получить к ним доступ (если вы решите использовать для них видимость private или protected), и никто, кто не знает, что они делают, не станет с ними ввязываться. 1013 *

Пример:

class Circle {
public:
    Circle(double x, double y, double diameter) : x(x), y(y), diameter(diameter) { }
    double X() const { return x; }
    double Y() const { return y; }
    double diameter() const { return diameter; }

    ...

private:
    double x, y, diameter;
};

Теперь, когда у нас есть два Circle с, они ведут себя нормально:

Circle c1(4.0, 4.0, 6.0);
Circle c2(1.0, 6.0, 3.0);
cout << c1.X() << endl
     << c2.X() << endl;
// prints 4 and 1

Но если мы сделаем это таким образом с глобалами:

// BAD, DON'T DO THIS
double x = 0, y = 0, diameter = 0;

class Circle {
public:
    Circle(double _x, double _y, double _diameter) {
        x = _x, y = _y, diameter = _diameter;
    }

    double X() const { return x; }
    double Y() const { return y; }
    double diameter() const { return diameter; }
};

Когда у нас два круга:

Circle c1(4.0, 4.0, 6.0);
Circle c2(1.0, 6.0, 3.0);
cout << c1.X() << endl
     << c2.X() << endl;
// prints 1 and 1

Последнее Circle, которое вы создадите, перезапишет все остальные Circle s данные. Как видите, это не очень хорошая вещь.

0 голосов
/ 06 августа 2011

В C ++ есть три вида переменных:

  • Глобальные переменные
  • Переменные-члены
  • Локальные переменные

Пример может помочь:

const float pi = 3.14; // A global variable. Always the same value.

class Circle
{
  private:
    float radius; // Member variable.

  public:
    Circle(float radius=0) { this.radius = radius; }
    float GetRadius() { return radius; }
    float GetDiameter() { return radius * 2; }
    float GetArea() { return pi * radius * radius; }
}

void PrintCircle(Circle& c, char* name)
{
  cout << name << " Radius: " << c.GetRadius() << ", Diameter: " << c.GetDiameter()
    << ", Area: " << c.GetArea();
}

void ShowCircle(float radius)
{
  Circle unit(1);  // Local variable
  Circle c(radius);  // Local variable
  PrintCircle(unit, "Unit circle");
  PrintCircle(c, "My circle");
}

int main(int argc, int** argv)
{
  ShowCircle(2);
  ShowCirlce(3);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...