【问题标题】:Overloading << operator to store data重载 << 操作符来存储数据
【发布时间】:2012-04-08 22:14:07
【问题描述】:

首先,我一直在四处寻找我的特定问题,但我无法找到任何答案。 所以,我想做的是重载&lt;&lt; 运算符,以便我可以这样做:

myObj = new MyObj();
unsigned int v = 2; 
myObj << v;

请记住,使用此类:

class MyObj{
private:
  char *data;
  int count;

public:
  MyObj(){ data = new char[64]; count = 0; }
  //This "is" the overloaded << method
  template <typename T>
  T& operator<<(T val){
    *(T*)(data + count) = val;
    count += sizeof(T);
  }
}

效果应该和这个一样(假设data是公共属性):

myObj << v;

应该是一样的

*(unsigned int*)(myObj.data + myObj.count) = v;
myObj.count += sizeof(v);

关于如何做的任何想法?我只找到了重载 I/O 或位运算符的方法,但是像这样。

谢谢!

【问题讨论】:

  • 好的,对不起。标题应该是“>”。我也想重载>>,但这不是我打算发布的内容。
  • 您应该可以使用标签下方的链接来编辑您的问题。反正我不是C++人,但不是operator&lt;&lt;,不是overload&lt;&lt;
  • 称为算子
  • 准确来说,多半叫T &amp; operator &lt;&lt; (T &amp; val)
  • 你的问题是什么?您是否担心未定义的行为、缓冲区溢出、不知道解组的正确类型或其他问题?因为operator&gt;&gt;基本上和operator&lt;&lt;一样被重载了。

标签: c++ operator-overloading


【解决方案1】:

如果我理解正确,你有

MyObj *myObj;
......
myObj = new MyObj();
unsigned int v = 2; 
myObj << v;

为了能够像这样使用&lt;&lt;,您通常需要:

MyObj myObj;
......
unsigned int v = 2; 
myObj << v;

或者你可以使用:

myObj = new MyObj();
unsigned int v = 2;
(*myObj) << v;

如果你想写myObj &lt;&lt; u &lt;&lt; v这样的代码,还需要:

....
    template <typename T>
    MyObj& operator<<(T val){
        *(T*)(data + count) = val;
        count += sizeof(T);
        return *this;
    }
....

【讨论】:

  • 虽然我已经解决了它,但我缺少最后一块。非常感谢!
  • +1 但请注意 *(T*)(data + count) = val; 仅适用于 POD 类型...并且应该是显式的 reinterpret_cast... 并且使用 std::num_getstd::num_put 等专业化可以更好地完成此任务每个可序列化类的常规 operator&lt;&lt; 重载。
  • 至于 POD 这不是问题,我只是使用基本类型。我知道我这样做的方式非常“hacky”,而不是最安全的方式。但是考虑到它的使用情况,我需要它快速而不可靠,我会保持原样。不过,我会看看你对进一步记录和未来项目的建议。谢谢
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多