stevenmtroy 发表于 2020-3-19 21:02:00

前置声明

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

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

        extern class string;

        class A {
                  private:
                        string s;
                  };

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

        extern class string;

        string s;

另外,第一种情况的解决方法除了将iostream、string包含进来,还有别的办法吗?

bin554385863 发表于 2020-3-19 22:38:16

请说明你学的是纯C还是c++

stevenmtroy 发表于 2020-3-19 23:03:25

本帖最后由 stevenmtroy 于 2020-3-19 23:05 编辑

bin554385863 发表于 2020-3-19 22:38
请说明你学的是纯C还是c++

先学的纯C,然后继续学的C++,这个问题应该是偏向于C++的。

bin554385863 发表于 2020-3-19 23:24:05

stevenmtroy 发表于 2020-3-19 23:03
先学的纯C,然后继续学的C++,这个问题应该是偏向于C++的。

完整代码发出来

stevenmtroy 发表于 2020-3-19 23:59:06

本帖最后由 stevenmtroy 于 2020-3-20 00:01 编辑

bin554385863 发表于 2020-3-19 23:24
完整代码发出来

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

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

int main(void)
{
   A myclass;
   return 0;
}
头文件在编译时会报错:不允许使用不完整的类型

bin554385863 发表于 2020-3-20 00:04:28

stevenmtroy 发表于 2020-3-19 23:59
就是这一段,定义在一个头文件A.h中,
extern class string;



你extern class string;是怎么来的?c++本身就有string类,

stevenmtroy 发表于 2020-3-20 00:05:34

bin554385863 发表于 2020-3-20 00:04
你extern class string;是怎么来的?c++本身就有string类,

string.h中就有这个系统已经定义好的类

梦想灬远帆 发表于 2020-3-20 09:03:11

在头文件的后面加上using std::string; 试试

stevenmtroy 发表于 2020-3-20 12:12:47

梦想灬远帆 发表于 2020-3-20 09:03
在头文件的后面加上using std::string; 试试

如果不把头文件string包含进去,直接写using std::string不行,会报错:namespace "std"中没有成员“string”

bin554385863 发表于 2020-3-20 12:14:27

stevenmtroy 发表于 2020-3-20 00:05
string.h中就有这个系统已经定义好的类

那你直接include<string.h>就好了,况且string.h就是string的旧版本

stevenmtroy 发表于 2020-3-20 20:52:36

bin554385863 发表于 2020-3-20 12:14
那你直接include就好了,况且string.h就是string的旧版本

这个我知道可以用# include<string>解决,但是一般在多文件写代码时不推荐在头文件中包含其他的头文件,容易导致重复包含,所以就想知道有没有更好的办法。

bin554385863 发表于 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

你自己写头文件的时候也要写包含防护
页: [1]
查看完整版本: 前置声明