如何直接调用“operator->()”?

时间:2010-08-03 16:58:28

标签: c++

由于某些奇怪的原因,我需要直接调用operator->()方法。例如:

class A {
    public:
        void foo() { printf("Foo"); }
};

class ARef {
    public:
        A* operator->() { return a; }
    protected:
        A* a;
}; 

如果我有一个ARef对象,我可以通过写:

来调用foo()
aref->foo();

但是,我想获得指向受保护成员'a'的指针。我怎么能这样做?

5 个答案:

答案 0 :(得分:11)

aref.operator->(); // Returns A*

请注意,此语法也适用于所有其他运算符:

// Assuming A overloads these operators
A* aref1 = // ...
A* aref2 = // ...
aref1.operator*();
aref1.operator==(aref2);
// ...

为了更清晰的语法,您可以实施Get()函数或重载*运算符,以James McNellis建议允许&*aref

答案 1 :(得分:5)

您可以使用以下语法直接调用运算符:

aref.operator->()

您应该重载->*,以便使用与指针的使用一致:

class ARef {
    public:
        A* operator->() { return a; }
        A& operator*() { return *a; }
    protected:
        A* a;
}; 

然后您可以使用以下命令获取指针值:

&*aref

您还可以实现一个直接返回get()的{​​{1}}成员函数,这比任何一个解决方案都要清晰得多(大多数智能指针类提供A*成员函数)。

答案 2 :(得分:3)

您可以直接致电operator->()

A* result = a.operator->();

答案 3 :(得分:2)

我可能不会一起调用它,而是创建一个新成员,它会做同样的工作,因为它会更好地阅读:

class ARef {
public:
    A* operator->() { return get(); }
    A* get() const { return a; }
protected:
    A* a;
};

答案 4 :(得分:2)

如果没有任何朋友,你就无法在课程a或其后代中找到“指向受保护成员A”的指针。无论您如何称呼,运营商->都不会帮助您。

鉴于ARef的当前界面,获取a指针的唯一方法是在类A **pa = &a的某个方法中执行A之类的操作或一些后裔班。

我不知道为什么你需要一个指向a的指针,坦白说它对我来说似乎没什么实际意义,但如果你真的需要它,你可以添加一个单独的方法那就是那个

class ARef {
public:
  ...
  A** get_ptr_to_a() { return &a; }
  ...
};