由于某些奇怪的原因,我需要直接调用operator->()方法。例如:
class A {
public:
void foo() { printf("Foo"); }
};
class ARef {
public:
A* operator->() { return a; }
protected:
A* a;
};
如果我有一个ARef对象,我可以通过写:
来调用foo()aref->foo();
但是,我想获得指向受保护成员'a'的指针。我怎么能这样做?
答案 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; }
...
};