Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?_C++_Pointers_Encapsulation_Member_Pointer To Member - Fatal编程技术网

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

C++ 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?,c++,pointers,encapsulation,member,pointer-to-member,C++,Pointers,Encapsulation,Member,Pointer To Member,这是一个相当复杂的问题,但我已经尝试从实际的代码库中尽可能地简化代码。假设我有一些类T,其中嵌套了类s和M。我有一些S的method1和method2,我还有一个指针selectedMethod,默认情况下指向两种方法中的一种 class T { class S { T &t; double method1(std::vector <double> params); double method2(std::ve

这是一个相当复杂的问题,但我已经尝试从实际的代码库中尽可能地简化代码。假设我有一些类
T
,其中嵌套了类
s
M
。我有一些
S
method1
method2
,我还有一个指针
selectedMethod
,默认情况下指向两种方法中的一种

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;
}
而不是简单地

double T::M::method3(std::vector <double> vec){

    double ret = (*t.s.selectedMethod)(vec);

    return ret;
}
double T::M::method3(std::vector vec){
双ret=(*t.s.选择方法)(vec);
返回ret;
}
??对我来说,前缀
&t.s->
似乎是多余的

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

这似乎只是因为您将指向成员的指针存储在调用该成员的同一对象中。但考虑到一般情况

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

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


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

这里不需要一个t.s,但这取决于它是如何连接的。通常,事实上,嵌套中的类与其实例不相关。这些类无法嵌套,您仍将使用相同的代码。只有T::M才是M。
auto foo_ptr = &SomeClass::foo;
SomeClass obj;

(obj*.foo_ptr)();