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
对象中设置值,或者您需要将aNum
从B
移动到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
的构造函数可以使用它的初始化列表来初始化bObj
:A(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 ++为嵌套类制作构造函数的主要内容,如果未能解决你的问题,请参考以下文章