1

1つの関数だけの演算子をオーバーロードすることは可能ですか?'->'演算子をオーバーライドしたいのですが、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()
4

3 に答える 3

4

->演算子は、ダミーのreturnオブジェクトでオーバーロードできます。真の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;
}
于 2013-03-11T19:17:29.143 に答える
3

基本クラスに移動できる場合print()、それは非常に簡単です。

class CatBase
{
public:
    void print();
};

class Cat : private CatBase
{
public:
    void walk();

    CatBase* operator->() { return this; }
    const CatBase* operator->() const { return this; }
};
于 2013-03-11T19:15:14.937 に答える
2

C++そのようなことを「直接」行うことはできません。あなたが持っているベストショットは、クラスCatから継承し、メソッドprintを仮想化し、子クラスで異なる方法で実装することです。

于 2013-03-11T19:15:06.973 に答える