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的情况.必须检查每个呼叫的异常.在那种情况下,我发现<<重载很容易打字.所以我做了这样的语法
你在这里遇到麻烦的原因是这是对操作符重载的不当使用.运算符重载最适用于以下位置:
operator =.operator <<流插入或operator <将类型存储在标准容器类中.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 都没有任何期望,所以你应该完全没问题.
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |