首页 > 解决方案 > 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?

问题描述

这是一个非常复杂的问题,但我试图从我的实际代码库中尽可能地简化代码。假设我有一些T带有嵌套类的类SM. 我有一些方法method1method2S并且我还有一个指针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并分别对应于使用指针。Msmt

接下来,假设我想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->似乎是多余的。

标签: c++pointersencapsulationmemberpointer-to-member

解决方案


对我来说,前缀&t.s->似乎是多余的

看起来只是这样,因为您将指向成员的指针存储在调用成员的同一对象内。但考虑到一般情况

auto foo_ptr = &SomeClass::foo;
SomeClass obj;

(obj*.foo_ptr)();

语法的两个部分都是必需的。一个显然表示成员,而另一个表示正在访问的对象。

在您的特殊情况下,对象可能“出现”两次,但表达式的两端仍然表示不同的事物。在右手边t.s.selectedMethod仍然只指定指针。编译器没有义务检查表达式并从中推断出对象。


推荐阅读