在没有方法的情况下调用类时,类是否可以返回值?
例如:
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;
我显然遗漏了很多东西,但这种操作可能吗?
在没有方法的情况下调用类时,类是否可以返回值?
我怀疑我们必须将您的问题解读为"在没有显式getter方法声明的情况下调用时返回值?">
是的,你可以提供一个过载的演员扮演操作员:
class myClass{
private:
int iVal;
public:
void setVal(const int i){ iVal = i; }
// vvvvvvvvvvvvvv
operator int() const {
return iVal;
}
};
请参阅现场演示。
您的代码还修复了一些其他小错误
这允许您在任何上下文中使用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)
实现将使用此重载自动推导int
的myClass
强制转换重载。
至于您的评论:
我认为描述我的意思的最佳方式类似于其他类处理这一问题。例如,字符串可以在没有方法的情况下打印,所以我想知道如何实现它。
这应该是这样的:
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;
// ^^^^^^^^^^^^^
}
另一个现场演示
或者当然使std::ostream& operator<<(std::ostream&, const myClass&)
运算符过载。
首先,您不想返回一个值,您想将一个值写入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;
}