如何製作通過引用進行比較但強制其無法在函數中創建的類型(防止引用堆棧/已刪除對象)。如何製作可輕鬆通過參考進行比較的類型
我想出了下面的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