如何制作通过引用进行比较但强制其无法在函数中创建的类型(防止引用堆栈/已删除对象)。如何制作可轻松通过参考进行比较的类型
我想出了下面的Error类型,并为它感到自豪,直到我意识到你可以在函数内部“返回Error :: New(...)”。问题出在h()函数中。
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
class Error {
std::string _str;
const Error &from;
Error();
Error(const char *s)
: _str(s), from(*this)
{
}
public:
Error(const Error &err)
: from(err.from)
{
}
static Error New(const char *s) {
return Error(s);
}
bool operator== (const Error &rhs) const {
return (&from == &rhs.from);
}
bool operator!= (const Error &rhs) const {
return (&from != &rhs.from);
}
std::string ToString() {
return from._str;
}
public:
static const Error None;
};
const Error Error::None("none");
// user errors
auto ErrConnect = Error::New("failed to connect");
auto ErrWrite = Error::New("invalid write");
Error f() {
return ErrConnect;
}
Error g() {
return Error::None;
}
Error h() {
return Error::New("test");
}
int main()
{
printf("ErrConnect == ErrConnect : %d\n", ErrConnect == ErrConnect);
printf("ErrConnect == ErrWrite : %d\n", ErrConnect == ErrWrite);
printf("f() == ErrConnect : %d\n", f() == ErrConnect);
printf("f() == ErrWrite : %d\n", f() == ErrWrite);
printf("f() != ErrConnect : %d\n", f() != ErrConnect);
printf("f() != ErrWrite : %d\n", f() != ErrWrite);
printf("f() == Error::None : %d\n", f() == Error::None);
printf("f() != Error::None : %d\n", f() != Error::None);
printf("g() == Error::None : %d\n", g() == Error::None);
printf("g() != Error::None : %d\n", g() != Error::None);
printf("f().ToString() : %s\n", f().ToString().c_str());
printf("ErrConnect.ToString() : %s\n", ErrConnect.ToString().c_str());
auto err = f();
auto err2 = err;
auto err3 = err2;
printf("err3 == ErrConnect : %d\n", err3 == ErrConnect);
auto err4 = h();
printf("err4 from h() : %s\n", err4.ToString().c_str());
}
在引用变量中&只有在声明时使用&in,如果您要比较两个地址。 [指针和引用变量之间的区别](http://stackoverflow.com/questions/15995463/in-function-declaration-return-type/15995482#15995482) – 2013-04-25 17:23:04