这是一个令人费解的问题,但我尝试从实际代码库中尽可能简化代码。假设我有一些带有嵌套类T
和S
的M
类。我有一些method1
的方法method2
和S
,还有一个指针selectedMethod
,它指向两种方法中的一种,默认为method1
。
class T
{
class S
{
T &t;
double method1(std::vector <double> params);
double method2(std::vector <double> params);
double (S::*selectedMethod)(std::vector <double>) = &S::method1;
}
class M
{
T &t;
double method3(std::vector <double> vec);
}
S s;
M m;
}
如图所示,我使用指针
T
存储了S
的实例,M
和s
的实例分别对应于m
和t
的实例。接下来,假设我要在
selectedMethod
的某个方法method3
中调用指向M
的任何方法。为什么必须这样做:double T::M::method3(std::vector <double> vec){
double ret = (&t.s->*t.s.selectedMethod)(vec);
return ret;
}
而不是简单
double T::M::method3(std::vector <double> vec){
double ret = (*t.s.selectedMethod)(vec);
return ret;
}
?在我看来,前缀
&t.s->
似乎是多余的。
最佳答案
To me the prefix
&t.s->
seems redundant
似乎只有这种方式,因为您将指向成员的指针存储在调用该成员的同一对象内。但考虑到一般情况
auto foo_ptr = &SomeClass::foo;
SomeClass obj;
(obj*.foo_ptr)();
语法的两个部分都是必需的。一个显然表示成员,而另一个表示正在访问的对象。
在您的特殊情况下,对象可能会“出现”两次,但是表达式的两端仍表示不同的事物。在右侧
t.s.selectedMethod
仍然仅指定指针。编译器没有义务检查表达式并从中求出对象。
关于c++ - 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61920083/