c++ - 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?

标签 c++ pointers encapsulation member pointer-to-member

这是一个令人费解的问题,但我尝试从实际代码库中尽可能简化代码。假设我有一些带有嵌套类TSM类。我有一些method1的方法method2S,还有一个指针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的实例,Ms的实例分别对应于mt的实例。

接下来,假设我要在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/

相关文章:

c++ - 无法解决错误 : indirection requires pointer operand ('int' invalid)

c - 如何将指针转换为嵌套在结构中的 void ?

c# - 公共(public)实例变量访问错误: "An object reference is required for the non-static field, method, or property..."

c++ - 如何正确打印 __FILE__ 扩展到的字符串?

c++ - 嵌套的 for_each 循环导致 vector 大小意外增加

PHP指针和变量冲突

java - 在 Java 的抽象类中使用 protected 字段

c++ - 未解析的外部符号 CLRCreateInstance

c++ - 两步复制省略以在构造函数调用中捕获右值作为实例变量

c++ - 您如何将实现接口(interface)的类的成员交给使用该接口(interface)的另一个类?