当某个地方使用该对象时,是否可以使一个类默认返回一个特定的成员变量(不使用getter成员函数)?
如果我有这门课程:
class A{
public:
A(int nr) : number(nr){};
~A();
int getNr(){ return this->number };
int number;
};
要在程序中稍后设置并获取其编号,我可以这样做:
int main(){
A thing(23);
std::cout<<"Your number is: "<<thing.getNr();
return 0;
}
但我想做的是:
std::cout<<"Your number is: "<<thing;
得到完全相同的结果,默认情况下返回成员变量“ number ”。这可以以某种方式完成/设置吗?
我知道有人可能在想“为什么不直接使用整数?” - 我正在创建一个应该能够“变成“任何类型,然后像指定的类型一样,如果我能够使它在这方面的行为更像是整数,双打,字符串,那将是很好的。
答案 0 :(得分:2)
您的具体示例会在<<
上调用A
stream insertion operator。此运算符can be overloaded可以执行您想要的操作:
#include <iostream>
class A{
public:
A(int nr) : number(nr) { }
~A() { }
int getNr() const { return this->number; }
int number;
};
std::ostream& operator<<(std::ostream& os, const A& a) {
os << a.getNr();
return os;
}
int main(int, char *[]) {
A a(42);
std::cout << a << std::endl; // prints 42
}
请注意,我已对您的代码进行了一些其他小修正(修复了丢失的;
并删除了一些不必要的修补程序;将const
添加到getNr()
)。
对于其他情况,例如将类型A
的参数传递给接受不同类型参数的函数,您可以定义编译器调用的user-defined conversion operators以转换A
到另一种类型。例如:
void doSomething(int x) {
// ...
}
class A{
public:
A(int nr) : number(nr){}
~A(){}
int getNr(){ return this->number; }
int number;
operator int() { return getNr(); }
};
int main(int, char *[]) {
A a(42);
doSomething(a); // calls operator int() above
return 0;
}
小心使用用户定义的转换运算符。特别是,通常最好标记它们explicit
并使用static_cast<T>()
来触发转化。隐式转换可以很快解决重载问题。