是否可以仅为一个函数重载操作符。我想覆盖' - >'运算符,但仅在使用print函数调用它时( - > print())。我理解这是一个奇怪的请求,但我正在努力完成某个API,我需要这样的东西。
例如:
Cat cat;
cat.walk();
cat->print(); //I want to overload only this call
但是,我不想重载' - >'所有案件的经营者。例如:
Cat* cat;
cat->walk(); //this should work normally
cat->print(); //this wouldn't call the print() function,
//since I overloaded cat->print()
答案 0 :(得分:4)
你可以重载 - >具有虚拟返回对象的运算符。真正的print()方法可以是私有的,只能通过访问器访问。在一个最小的例子中:
#include <iostream>
struct Cat;
struct CatAccessor {
private:
friend class Cat;
CatAccessor(Cat& cat) : cat(cat) {}
Cat& cat;
public:
void print();
CatAccessor* operator->() { return this; }
};
struct Cat {
CatAccessor* operator->() { return CatAccessor(*this); }
void walk() { std::cerr << "Walk called" << std::endl; }
private:
void print() { std::cerr << "Print called" << std::endl; }
friend class CatAccessor;
};
void CatAccessor::print() { cat.print(); }
int main() {
Cat cat;
cat.walk();
cat->print();
Cat* catp = &cat;
catp->walk();
// error: catp->print();
return 0;
}
答案 1 :(得分:3)
如果你可以将print()
移到基类,那很简单:
class CatBase
{
public:
void print();
};
class Cat : private CatBase
{
public:
void walk();
CatBase* operator->() { return this; }
const CatBase* operator->() const { return this; }
};
答案 2 :(得分:2)
C++
不允许您“直接”执行此类操作。最好的方法是继承Cat类,使方法打印为虚拟,并在子类中以不同方式实现。