如何在 C++ 中获取嵌套类的实例

Posted

技术标签:

【中文标题】如何在 C++ 中获取嵌套类的实例【英文标题】:How to get instance of nested class in C++ 【发布时间】:2010-03-03 10:52:37 【问题描述】:

我有以下代码:

class outer

    struct inner
    
        int var1;
        int var2;
        inner()  var1 = 1; var2 = 2; 
    ;

    inner inner_instance;

public:
    const inner *get_inner()  return &inner_instance; 
;

int main(int argc, char *argv[])

    // 1
    outer outer_instance;
    cout << outer_instance.get_inner()->var1 << endl;

    // 2
    // this cannot be compiled because outer::inner is private
    //const outer::inner *inner_ref = outer_instance.get_inner();
    //cout << inner_ref->var1;

    // 3
    const int *inner_var2 = (int *) outer_instance.get_inner();
    inner_var2++;
    cout << *inner_var2 << endl;

    return 0;

我明白为什么 No.2 不能编译了。我只是不知道编译器的设计思想是什么,它允许访问私有嵌套类的公共字段,但不允许访问嵌套类本身,如 No.1。实例数据仍在内存中。如果我知道这种私有嵌套类的结构,我仍然可以像 No.3 那样实现赋值。

这是否意味着最好不要在公共函数中返回私有嵌套类的指针或引用?如果我真的必须将有关嵌套类的某些内容返回给外部世界,是否将其公开?

谢谢!

【问题讨论】:

不,如果您想隐藏任何内容,请将它们设为私有而不是公开。 【参考方案1】:

如果要在外部类之外使用结构内部定义,请将其公开。

class outer

public:
    struct inner
    
        int var1;
        int var2;
        inner()  var1 = 1; var2 = 2; 
    ;
private:
    inner inner_instance;
public:
    const inner *get_inner()  return &inner_instance; 
;

【讨论】:

【参考方案2】:

你是对的,公共 API 中使用的类型最好不是私有的。不过,它们可能只被前向声明(如果您只在 API 上使用指针或引用)。

【讨论】:

私有嵌套类应该只被它们的宿主类使用,对吧?

以上是关于如何在 C++ 中获取嵌套类的实例的主要内容,如果未能解决你的问题,请参考以下文章

java 父类如何在运行期动态获取子类类名

C++嵌套类的修改——以如本RVC相机的SDK包为例

如何在 Flutter 中使用 Firestone 的 streambuilder 获取嵌套文档?

如何使用外部类的实例访问嵌套类的属性[重复]

表单的 post 方法如何在幕后实际工作

如何在 Laravel 中获取嵌套关系的实例?