C ++为嵌套类制作构造函数

Posted

技术标签:

【中文标题】C ++为嵌套类制作构造函数【英文标题】:C++ making constructor for nested class 【发布时间】:2016-11-10 00:25:36 【问题描述】:

考虑如下类:

class A 
    public:
    // code...

    private:
    class B 
        public:
        int aNum;
        // ...
    

我要为A做一些构造函数,比如:

A::A()   // default...

A::A(int input)  /* code... */ 

所以我想知道如何访问aNum,因为它不在A的直接下方。

【问题讨论】:

要访问aNum,您需要一个A::B 对象,您还没有在任何地方声明它。 B 本身就是一个类,它不是 A 的子集或依赖项。将 class B 放在它所在的位置与将它完全放在 A 之外的唯一区别是您通过A::B 而不是::B 引用该课程。 (具有相关访问权限) 【参考方案1】:

正如一些 cmets 所说,您不能仅仅从 A“访问”aNum,因为它是 B 的一部分。

您需要在A 中创建一个B 对象并在B 对象中设置值,或者您需要将aNumB 移动到A

如果您在A 中创建一个B 对象,这将如下所示。

struct A 
    A(int input) 
        bObj.aNum = input;
    

    // ...

private:
    struct B 
        int aNum;
        // ...
    ;

    B bObj;
;

如果您想直接从A 访问它,您应该考虑aNum 是否真的是嵌套类的一部分。在这种情况下,您的类设计很可能是错误的,并且 aNum 实际上是 A 的一部分,而不是 B

【讨论】:

我会给B自己的构造函数来初始化aNum,然后A的构造函数可以使用它的初始化列表来初始化bObjA(int input) : bObj(input) 【参考方案2】:

就像你的班级有任何数据成员一样,没有什么不同

class A 
    public:
    // code...

    private:
    class B 
        public:
        int aNum;
    

在您可以访问aNum 之前,它是类B 的非静态数据成员,您必须创建一个B 类型的对象,如下所示:

class A

    public:
        const B& getObjectB() const  return objectB; ; 
    private:
        B objectB;

你可以这样做:

A objectA;
objectA.getObjectB().aNum;

这里发生的是我们调用getObjectB(),它返回objectB,然后通过它调用aNum

【讨论】:

【参考方案3】:

A 需要某种方式来引用 B 类型的对象,这里是一个简单的例子。

class A 
    private:
        class B 
        public:
            int aNum;
        ;
        B b;
    public:
        A(int);
;
A::A(int input) 
    b.aNum = input;

【讨论】:

以上是关于C ++为嵌套类制作构造函数的主要内容,如果未能解决你的问题,请参考以下文章

构造函数、ECMAscript(ES6)

C ++声明一个继承的构造函数?

31.C++-虚函数之构造函数与析构函数分析

常见的构造函数类型

如何在C ++中的另一个类中声明一个类的构造函数

c ++ templates为特定类型的类调用特定的构造函数