如何将用户定义类型的变量写入流中

时间:2010-10-30 12:31:57

标签: c++ class-design

我不是指类中的变量,而是整个类的默认值。

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 个答案:

答案 0 :(得分:1)

不,课程的思维方式没有价值。

你可能想做的是重载&lt;&lt;操作者:

ostream& operator<<(ostream& output, const Scalar& val)
{
  output << val.value;
  return output;
}

答案 1 :(得分:0)

不,你不能但是你可以重载operator&lt;&lt;为你的班级和ostream获得理想的效果

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

您的代码现在可以工作并产生欲望结果

答案 2 :(得分:0)

是。有可能的。只需初始化类的构造函数中的所有值。使用class而不是struct。

答案 3 :(得分:0)

在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;
  }
};

答案 4 :(得分:0)

  

我的意思是该类的默认值,因此如果您仅通过名称foo调用该对象,则默认情况下会返回foo.value

实际上可以定义从Scalarint的隐式转换:

struct Scalar
{
    unsigned int value;

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

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

但是隐式转换在C ++社区中通常是不受欢迎的,因为它可能使代码很难阅读。 (我想这就是为什么没人提到转换运算符的原因。)