在没有方法的情况下调用它时,类是否可以返回值?
例如:
class myClass{
private:
int iVal;
public:
setVal(const int i){ iVal = i; }
}
myClass m;
m.setVal(3);
cout << m << endl;
// In this case, m would return 3;
我显然遗漏了很多东西,但这种操作是否可行?
答案 0 :(得分:3)
在没有方法的情况下调用它时,类是否可以返回值?
我怀疑我们必须将您的问题读作“,以便在没有明确的 getter 方法声明的情况下调用它时返回一个值?”
是的,您可以提供重载的强制转换操作符:
class myClass{
private:
int iVal;
public:
void setVal(const int i){ iVal = i; }
// vvvvvvvvvvvvvv
operator int() const {
return iVal;
}
};
请见Live Demo。
还修复了一些其他小错误。
这允许您在任何上下文中使用myClass
,因为它只是int
值:
int main()
{
myClass m;
m.setVal(3);
int x = m + 5; // <<<<<<<<<<<<<<<<<<<<
std::cout << x << std::endl; // outputs 8
}
std::ostream& operator<<(std::ostream&, T)
实现将使用此重载自动推断myClass
的{{1}}强制转换重载。
至于your comment:
我认为描述我的意思的最好方法是类似于其他类处理这个。例如,可以在没有方法的情况下打印字符串,因此我想知道如何实现它。
这应该是这样的:
int
在这种情况下需要显式调用强制转换运算符,如下所示:
class myClass{
private:
int iVal;
double dVal;
public:
void setVal(const int i){ iVal = i; }
void setVal(const double d){ dVal = d; }
operator std::string () const {
std::ostringstream oss;
oss << "myClass { iVal = " << iVal
<< ", dVal = " << dVal
<< " }";
return oss.str();
}
};
当然会重载int main()
{
myClass m;
m.setVal(3);
m.setVal(3.14);
std::cout << (std::string)m << std::endl;
// ^^^^^^^^^^^^^
}
运算符,如other answer中所述。
答案 1 :(得分:2)
首先你不想返回一个值,你想给std :: ostream写一个值,其中cout是一个通常链接到你的控制台的实例。
#include <iostream>
class myClass{
private:
int iVal;
public:
void setVal(const int i){ iVal = i; }
int getVal() const { return iVal; }
};
std::ostream& operator<< ( std::ostream& in, const myClass& c)
{
in << c.getVal();
return in;
}
int main()
{
myClass m;
m.setVal(3);
std::cout << m << std::endl;
}
但要记住一些要点:
首先,operator
不是此类成员。如果它不是类成员,则无法访问私有成员。为此,您可以使operator
成为该类的朋友或准备一个getter方法,如示例所示。
如果您需要friend
变体,请按以下方式使用:
...
public:
void setVal(const int i){ iVal = i; }
friend std::ostream& operator<< ( std::ostream& in, const myClass& c);
...
std::ostream& operator<< ( std::ostream& in, const myClass& c)
{
in << c.iVal;
return in;
}