鱼C论坛

 找回密码
 立即注册
查看: 1749|回复: 11

前置声明

[复制链接]
发表于 2020-3-19 21:02:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 stevenmtroy 于 2020-3-19 21:55 编辑

在头文件中,为什么在类A中这样定义字符串类s,编译器会报错:不允许使用不完整的类型

        extern class string;

        class A {
                    private:
                        string s;
                  };

而直接这样定义编译器就不会报错:

        extern class string;

        string s;

另外,第一种情况的解决方法除了将iostream、string包含进来,还有别的办法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-19 22:38:16 | 显示全部楼层
请说明你学的是纯C还是c++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 23:03:25 | 显示全部楼层
本帖最后由 stevenmtroy 于 2020-3-19 23:05 编辑
bin554385863 发表于 2020-3-19 22:38
请说明你学的是纯C还是c++


先学的纯C,然后继续学的C++,这个问题应该是偏向于C++的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 23:24:05 | 显示全部楼层
stevenmtroy 发表于 2020-3-19 23:03
先学的纯C,然后继续学的C++,这个问题应该是偏向于C++的。

完整代码发出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 23:59:06 | 显示全部楼层
本帖最后由 stevenmtroy 于 2020-3-20 00:01 编辑


就是这一段,定义在一个头文件A.h中,
extern class string;

class A
{
private:
         string s;
};
然后,主程序:
# include<iostream>
# include<string>

int main(void)
{
     A myclass;
     return 0;
}
头文件在编译时会报错:不允许使用不完整的类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 00:04:28 | 显示全部楼层
stevenmtroy 发表于 2020-3-19 23:59
就是这一段,定义在一个头文件A.h中,
extern class string;

你extern class string;是怎么来的?c++本身就有string类,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 00:05:34 | 显示全部楼层
bin554385863 发表于 2020-3-20 00:04
你extern class string;是怎么来的?c++本身就有string类,

string.h中就有这个系统已经定义好的类
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 09:03:11 | 显示全部楼层
在头文件的后面加上using std::string; 试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 12:12:47 | 显示全部楼层
梦想灬远帆 发表于 2020-3-20 09:03
在头文件的后面加上using std::string; 试试

如果不把头文件string包含进去,直接写using std::string不行,会报错:namespace "std"中没有成员“string”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 12:14:27 | 显示全部楼层
stevenmtroy 发表于 2020-3-20 00:05
string.h中就有这个系统已经定义好的类

那你直接include<string.h>就好了,况且string.h就是string的旧版本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 20:52:36 | 显示全部楼层
bin554385863 发表于 2020-3-20 12:14
那你直接include就好了,况且string.h就是string的旧版本

这个我知道可以用# include<string>解决,但是一般在多文件写代码时不推荐在头文件中包含其他的头文件,容易导致重复包含,所以就想知道有没有更好的办法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 21:47:55 | 显示全部楼层
本帖最后由 bin554385863 于 2020-3-20 21:52 编辑
stevenmtroy 发表于 2020-3-20 20:52
这个我知道可以用# include解决,但是一般在多文件写代码时不推荐在头文件中包含其他的头文件,容易导致 ...


你是怎么学习的预编译?包含防护都不知道?

C/C++的标准库头文件都有包含防护

看看这个
https://www.cnblogs.com/yyxt/p/4253776.html

你自己写头文件的时候也要写包含防护
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表