Как я могу записать переменную определенного пользователем типа в поток - PullRequest
1 голос
/ 30 октября 2010

Я имею в виду не переменную в классе, а значение по умолчанию для класса в целом.

struct Scalar {
    unsigned int value;

    void toThePowerOf(int power);
    // etc.
}

Я хотел бы иметь возможность сделать что-то вроде

Scaler foo;
foo.value = 2;
foo.toThePowerOf(2);

std::cout << foo << std::endl; // Outputs 4!

Возможно ли это в C ++?

Ответы [ 5 ]

1 голос
/ 30 октября 2010

Нет, классы не имеют значения в вашем мышлении.

Что вы, вероятно, хотите сделать, это перегрузить оператор <<: </p>

ostream& operator<<(ostream& output, const Scalar& val)
{
  output << val.value;
  return output;
}
0 голосов
/ 30 октября 2010

Я имел в виду значение по умолчанию для класса, поэтому, если бы вы назвали этот объект только по его имени foo, он бы возвратил foo.value по умолчанию.

Это действительно возможночтобы определить неявное преобразование из Scalar в int:

struct Scalar
{
    unsigned int value;

    operator int() const
    {
        return value;
    }
};

int main()
{
    Scalar foo = {2};
    std::cout << foo << std::endl;
}

Но в сообществе C ++ обычно не одобряют неявные преобразования, потому что это может затруднить чтение кода.(Наверное, поэтому еще никто не упомянул операторы преобразования.)

0 голосов
/ 30 октября 2010

Использовать значение по умолчанию в ctor. Сделайте ctor явным, если вы не хотите неявных преобразований.

struct Scalar {
  unsigned int value;

  Scalar(int value=0) : value (value) {}

  void toThePowerOf(int power) {
    // naive implementation just for show
    int new_value = 1;
    assert(power >= 0);  // or other error checking
    for (; power > 0; --power) {
      new_value *= value;
    }
    value = new_value;
  }

  friend std::ostream& operator<<(std::ostream &out, Scalar const &x) {
    out << x.value;
    return out;
  }
};
0 голосов
/ 30 октября 2010

Да.это возможно.Просто инициализируйте все значения в конструкторе класса.Используйте класс вместо struct.

0 голосов
/ 30 октября 2010

Нет, вы не можете, но можете перегрузить оператор << для своего класса и ostream, чтобы получить желаемый эффект </p>

std::ostream& operator << (std::ostream& out, const Scaler& foo)
{
   return out << foo.value;
}

Ваш код теперь будет работать и давать желаемый результат

...