运算符重载<< needs const; 产生头痛

pra*_*ran 1 c++ logic operator-overloading visual-c++

我试图超载operator <<,但它总是需要成为一个const功能.但是,我想更改此重载函数中的值.我该怎么做呢?

EDIT1:代码存根如下所示:

class Check

{   
public:
    void operator << (boost::any)
    {
        // checks weather the given is hresult,string(filename) or int(line no) 
        // and dump them into the exception object, 
        // There by hresult will initiate the object and int will throw the object.
        // so the input order must be like below
    }
private:
    Exception exception;
};
Run Code Online (Sandbox Code Playgroud)

用法

Check   check;
check << file->open << __FILE__ << __LINE__ ;
Run Code Online (Sandbox Code Playgroud)

编辑2:这是谁曾经说过语法不好实现我不是一个很好的exp.程序员.我只是试图快速解决异常问题.我的动机是它不应该消耗更多的时间,它应该很容易打字.因为我的同事必须使用这个异常类.我试图找到一个解决方案,答案来自<<运算符重载.例如,考虑以下示例

1)我的方法

#define INFO __LINE__ << __FILE__
c++
RunAndCheck runAndCheck;

try
{
    runAndCheck << checkVersion() << INFO;
    runAndCheck << file->Open() << INFO;
    runAndCheck << file->rename() << INFO;
}
catch(...)
{
}
Run Code Online (Sandbox Code Playgroud)

2)传统方法

#define INFO __FILE__,__LINE__
try
{
    runAndCheck.check(checkVersion(),INFO);
    runAndCheck.check(file->Open(),INFO);
    runAndCheck.check(file->rename(),INFO);
}
catch(...)
{
}
Run Code Online (Sandbox Code Playgroud)

可能在这个存根中它或多或少相同,但考虑使用win32API的情况.必须检查每个呼叫的异常.在那种情况下,我发现<<重载很容易打字.所以我做了这样的语法

Ben*_*igt 7

operator<< 不需要是const函数.

但是,您真正的问题似乎是无效返回类型.为了将插入链接在一起,您需要返回*this.


tem*_*def 5

你在这里遇到麻烦的原因是这是对操作符重载的不当使用.运算符重载最适用于以下位置:

  1. 您的类型类似于内置类型(例如,数学类型,数组或指针),并且您希望支持类型上的内置运算符.
  2. 您的类型需要支持复制,在这种情况下您应该实现operator =.
  3. 您的类型需要与标准库(如STL或流)接口,在这种情况下,您可能需要实现operator <<流插入或operator <将类型存储在标准容器类中.
  4. 您想要实现一个函数对象,在这种情况下您应该实现operator ().

您上面的代码不属于任何这些类别,因此任何使用它都可能会让人感到困惑.例如,如果不熟悉您的项目的人看到这样的事情:

myCheck << myValue;
Run Code Online (Sandbox Code Playgroud)

他们可能会想"哦,那是某种流插入"或"哦,这是一种数学类型的位移." 但是,在您的情况下,此代码实际上意味着"让检查器对象myCheck验证" myValue.如果这就是你想要做的事情,那就写一些更明确的东西

myCheck.validate(myValue);
Run Code Online (Sandbox Code Playgroud)

现在,有人查看您的代码可以更好地了解它的工作原理以及它正在尝试做什么.

一般来说,在编写代码时要考虑最小惊讶原则 - 代码不应该让你惊讶于它是如何工作的.通过operator <<在非标准上下文中使用,您可能会导致程序员误解您的代码或很难理解它的作用.通过在此相关和相关上下文中使用命名函数而不是重载运算符来更明确地表达您的意图,使代码更具可读性,并降低代码读取人员的可能性.

现在,至于你问题的实际答案.不要求operator <<成为const成员函数.想想像cout或的标准流类ofstream; 操作

cout << "Hello, world!" << endl;
Run Code Online (Sandbox Code Playgroud)

当然,cout通过将新数据推入其中来进行修改,就像操作一样

cout << setfill('0') << left << hex;
Run Code Online (Sandbox Code Playgroud)

cout通过更改格式标志进行修改.因此,如果您希望您的operator <<函数改变数据被推入的对象,请务必继续并使其成为非const成员函数.C++ 对任何重载运算符的constness或constnonss 都没有任何期望,所以你应该完全没问题.