C++的类中类定义如何解决在其它引用的时候解决符号重复的问题?

牧童吃五谷 2020-08-26 02:02:01
有两个类头文件Class1.h和Class2.h,两个头文件中定义的类相互有对方的指针引用,所以不能采用#include来引用对方类定义

//Class1.h的内容如下:

class CClass2;

class CClass1
{
public:
class CInnerClass
{
};

public:
CClass2* pClass2=nullptr;//这里定义正确
};

//Class2.h的内容如下:

class CClass1;

class CClass2
{
public:
CClass1* pClass1 = nullptr;//这里定义正确
CClass1::CInnerClass* pInnerClass = nullptr;//这里定义错误,无法编译
};

这样就造成CClass2中无法定义CClass1::CInnerClass类指针对象,不知道大家有没有解决方法?
...全文
731 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝域小兵 2020-10-07
  • 打赏
  • 举报
回复
你使用类中类的时候,没有看到声明,也没有看到定义,怎么能够使用呢,肯定编译就报错啊
  • 打赏
  • 举报
回复
引用 17 楼 牧童吃五谷 的回复:
楼上的,按照上面的源码是可以编译通过的,实际可能是我刚开始例子没有写好了,应该改为CClass2内部也有一个类中类定义,所以例子如下:
...
按照上面这样双方内部都有个类中类,我就发现编译通不过了,不知道怎么解决了


你的意思就是无论如何都要让它编译通不过~~~
你这样写导致循环引用(也叫循环依赖),解决的方法是把一个内部类,比如CClass2::CInnerClass移出来,不要放在CClass2内部,然后在class1.h中也提前声明一下它就好了
牧童吃五谷 2020-10-06
  • 打赏
  • 举报
回复
楼上的,按照上面的源码是可以编译通过的,实际可能是我刚开始例子没有写好了,应该改为CClass2内部也有一个类中类定义,所以例子如下: //Class1.h的内容如下: class CClass2; class CClass1 { public: class CInnerClass { }; public: CClass2* pClass2 = nullptr;//这里定义正确 CClass2::CInnerClass* pInnerClass = nullptr; // 这里编译不能通过 }; //Class2.h的内容如下: class CClass1; class CClass2 { public: class CInnerClass { }; public: CClass1* pClass1 = nullptr;//这里定义正确 CClass1::CInnerClass* pInnerClass = nullptr; // 这里也正常 }; 按照上面这样双方内部都有个类中类,我就发现编译通不过了,不知道怎么解决了
  • 打赏
  • 举报
回复
#12的例子用C++Builder 10.2.1、VC++ 2015 update 3、intel c++ XE 2015、G++ 5.1都测试通过,你的vs2019难道是阿山开发的~~~
  • 打赏
  • 举报
回复
你为什么那么轴呢~~~

//Class1.h的内容如下:

class CClass2;

class CClass1
{
public:
class CInnerClass
{
};

public:
CClass2* pClass2=nullptr;//这里定义正确
};


//Class2.h的内容如下:

class CClass1;

class CClass2
{
public:
CClass1* pClass1 = nullptr;//这里定义正确
CClass1::CInnerClass* pInnerClass = nullptr; // 这里也正常
};

测试程序:
#include <cstdio>
#include "class1.h"
#include "class2.h"

int main()
{
CClass2 c2;
printf("%p\n", c2.pInnerClass = 0);

return 0;
}
牧童吃五谷 2020-09-15
  • 打赏
  • 举报
回复
根据zjq9931的回复,我发现按照原来提的做法,确实是可以编译通过的,所以应该是两个类都有内部类的时候,就会出现这个问题的(这个问题确实是本人所编写的程序中出现的问题,因为现在所编写的程序比较复杂,出现了很多类种类定义,所以就出现了这种现象,临时解决的方案时,碰到这种情况就只能取消类中类定义,但程序结构看起来就不完美): 以下是修改的类定义 //Class1.h的内容如下: class CClass2; class CClass2::CClass2InnerClass;//编译不通过 class CClass1 { public: CClass1() { } ~CClass1() { } public: class CClass1InnerClass { public: long aaa = 10; }; public: CClass2* pClass2 = nullptr;//这里定义正确 CClass2::CClass2InnerClass* pClass2Inner = nullptr; }; //Class2.h的内容如下: class CClass1; class CClass1::CClass1InnerClass;//这个无法编译通过 class CClass2 { public: class CClass2InnerClass { public: long aaa = 5; }; public: CClass2() { } ~CClass2() { } public: CClass1* pClass1 = nullptr; CClass1::CClass1InnerClass* pInnerClass = nullptr; }; 这样就出现互相引用对方的类中类,造成无法定义内部类指针对象,不知道大家有没有解决方法?
牧童吃五谷 2020-09-15
  • 打赏
  • 举报
回复
我采用visual studio 2019经过测试,如果双方类中都有对方类及其类中类指针对象,则上面的不先#include 引用对方,然后再建立实际实际两个类对象的地方#include 两个类是无效,当然如果只有一方引用另外一方是可以的
牧童吃五谷 2020-09-15
  • 打赏
  • 举报
回复
我采用visual studio 2019经过测试,如果双方类中都有对方类及其类中类指针对象,则上面的不先#include 引用对方,然后在建立实际CClass1 class1; CClass2 class2;
yshuise 2020-09-12
  • 打赏
  • 举报
回复
不是模板,头文件为啥要写定义,只能是cpp才定义吧?
  • 打赏
  • 举报
回复
前面不是说了吗,两个.h都不要#include引用对方,在建立CClass2实例的源文件中#include "class1.h"即可(当然也要引用class2.h)
  • 打赏
  • 举报
回复
我在VS2015上用了,就是你的代码,正常使用啊。
Class1

#pragma once

class CClass2;

class CClass1
{
public:
CClass1() { printf("CClass1 Constructor\n"); }
~CClass1() { printf("CClass1 Destructor\n"); }
public:
class CInnerClass
{
public:
CInnerClass() { printf("CInnerClass Constructor\n"); }
~CInnerClass() { printf("CInnerClass Destructor\n"); }
};

public:
CClass2* pClass2 = nullptr;//这里定义正确
};



Class2

#pragma once

#include "Class1.h"
//Class2.h的内容如下:

class CClass1;

class CClass2
{
public:
CClass2() { printf("CClass2 Constructor\n"); }
~CClass2() { printf("CClass2 Destructor\n"); }
public:
CClass1* pClass1 = nullptr;
CClass1::CInnerClass* pInnerClass = nullptr;
};


main

#include <stdio.h>
#include "Class1.h"
#include "Class2.h"

int main()
{
CClass1 class1;
CClass2 class2;
return 0;
}
牧童吃五谷 2020-09-04
  • 打赏
  • 举报
回复
首先就是因为相互包含,所以不能用include的, 我考虑加个class CClass1::CInnerClass;但这个编译就会错误的
zerozerg2006 2020-08-28
  • 打赏
  • 举报
回复
一般这类操作是使用一个虚类作为,两个类都共同include并继承这个虚类
wallesyoyo 2020-08-28
  • 打赏
  • 举报
回复
再加个 class CClass1::CInnerClass; 前置声明不就行了?反正你这个也是指针。
  • 打赏
  • 举报
回复
2頭文件包含1的就好了, 1不包含2,前置聲明下class class2,cpp文件裡面包含2的頭文件就好
qq_40162781 2020-08-27
  • 打赏
  • 举报
回复
都在源文件包含就行了,定义也写在源文件
  • 打赏
  • 举报
回复
可以的,只要在建立CClass2实例的源文件中#include "class1.h"即可,如果还不行,换个编译器吧~~~

山河君 2020-08-26
  • 打赏
  • 举报
回复
class2.h是不是忘记包含class1.h头文件了? 前置声明中你定义了class1,但是没有定义class1里面的成员,直接在class2中定义class1中的成员为私有成员,是一定要看的到它的吧。

64,671

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧