在C ++中是否可以创建自定义方法,它将作为重载运算符?例如简单的类:
class A
{
public:
A(int val){ x = val;}
int getInt(){ return (x + 2); }
private:
int x;
};
如何使用方法toSpecialString
,例如,以特殊方式格式化我返回的int
,然后返回此string
(例如" abc14") 。例如:
A a(12);
std::cout << a.getInt().toSpecialString() << std::endl;
作为输出,我期待&#34; abc14&#34;。在C ++中是这样的吗?
答案 0 :(得分:3)
当然,例如
class A
{
struct ReturnedInt {
int x;
// constructor
ReturnedInt(int x_) : x(x_) { }
// "transparent" type cast to int
operator int() { return x; }
std::string toSpecialString() {
std::ostringstream oss{};
oss << "abc" << x;
return oss.str();
}
};
public:
A(int val){ x = val;}
ReturnedInt getInt(){ return (x + 2); } // I changed the return type but see the remarks below
private:
int x;
};
然后
int main () {
A a{12};
std::cout << a.getInt() << '\n';
std::cout << a.getInt().toSpecialString() << '\n';
}
打印
14
abc14
前者作为普通cout
传递给operator<<
的{{1}}(自动衰减),但在后者中我们使用返回值实际上是一个对象的事实。出于与前一行相同的原因,任何期望int
的函数也将接受int
。而且,在编译的二进制文件中,这种“包装器”结构应该是额外的零成本。
请注意,如果您不打算将其暴露给任何其他目的,则内部类可以是私有的(如我的示例中所示)。这不会与它被用作返回类型或调用其(公共)方法的事实相冲突。
答案 1 :(得分:1)
checkout scm
返回a.getInt().toSpecialString()
, a.getInt()
无效。 int
不是类,因此不能有成员函数。
可能的解决方案:
将int
添加为成员函数。
toSpecialString()
并将其用作:
class A
{
...
std::string toSpecialString()
{
return std::string("abc") + std::to_string(getInt());
}
};
添加另一个类来创建字符串。
a.toSpecialString();
并将其用作:
struct MyStringFormatter
{
std::string toSpecialString(int x)
{
return std::string("abc") + std::to_string(x);
}
};
如有必要,可以更新MyStringFormatter().toSpecialString(a.getInt());
以获取MyStringFormatter
的实例并返回字符串。
A
可以用作:
struct MyStringFormatter
{
std::string toSpecialString(A a)
{
return toSpecialString(a.getInt());
}
std::string toSpecialString(int x)
{
return std::string("abc") + std::to_string(x);
}
};
我的建议是使用第二种方法。它将类MyStringFormatter().toSpecialString(a);
与用于格式化A
。