c++ 的 坑真多之头文件

我发现类在做参数时,是可以不引用头文件,即不用#include"xxx.h"的,比如下面这样是没有问题的

#pragma once
#include <string>
#include <iostream>

class Humankind;
class Person {
public:
    Person();
    void sayHello(Humankind human);
};

但如果这个类是用来被继承,就编译不过,必须写头文件包含,即这样:

#pragma once
#include <string>
#include <iostream>
#include "Humankind.h"
class Person : Humankind{
public:
    Person();
    void sayHello();
};
时间: 2025-01-04 05:49:12

c++ 的 坑真多之头文件的相关文章

没有躲过的坑--头文件相互包含(Compiler error C2653: not a class or namespace name)

最近被自己坑儿了一把,改别人的代码,最后编译器这样报错的: error C2653: not a class or namespace name 简单描述一下: 有一个类A,声明和实现分别位于 a.h和a.cc中 有一个类B,声明和实现分别位于 b.h和b.cc中 类A的某个成员函数需要B类类型作为参数 类B的某个成员函数需要A类类型作为参数 a.h文件如下: #ifndef A_H_ #define A_H_ #include "b.h" class A { public: enum

.m文件导入C++头文件带来的错误

这几天的工作挖了不少的坑,遇到了各种千奇百怪的错误,现在好好总结一下. 新建一个工程,然后新建HelloCPP.h,HelloCPP.cpp文件,HelloCPP.h文件内容如下: #ifndef __CPPWrong__HelloCPP__ #define __CPPWrong__HelloCPP__ //#include <stdio.h> namespace hello { }; #endif /* defined(__CPPWrong__HelloCPP__) 就一个空的namespa

头文件&lt;ctype.h&gt;

头文件<ctype.h>声明了可以用于识别和转换字符的函数. 一.字符判断函数: 1.函数isalnum int isalnum(int c); 功能:判断变量c是否为字母或数字 返回值:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零. 2.函数isalpha int isalpha(int c); 功能:判断变量c是否为英文字母 返回值:字母返回非0,不是字母返回0. 3.函数iscntrl int iscntrl(int c); 功能:判断字符c是否为控制字符 返回值:当c

c 头文件&lt;ctype.h&gt;(一)

头文件<ctype.h>中声明了一些测试字符的函数. 每个函数的参数均为int类型,参数的值必须是EOF或可用unsigned char类型表示的字符,函数返回值为int类型. 如果参数c满足指定的条件,则函数返回非0值(表示真),否则返回0(表示假). 这些函数包括: 1.isalnum(c) 函数isalpha(c)或isdigit(c)为真 2.isalpha(c) 函数isupper(c)或者islower(c)为真 3.iscntrl(c) c为控制符 4.isdigit(c) c为

成为C++高手之头文件

但现在看起来真不爽,main.c依赖的文件不能在工程中管理,要修改那些文件的话麻烦大了.如何既能分成多个文件又能在工程中看到呢?可以,使用头文件(h文件). 头文件中只放那些不产生内存占用的代码,比如定义结构(定义结构不会产生内存分配,只有用结构定义变量时才产生内存分配).定义枚举,定义宏,声明变量,声明函数等.而且大都是一个c文件对应一个h文件.下面增加poker.h和player.h(注意main.c是不需要有h文件的,因为我们应该保证main.c只依赖别的文件,而不能被别的文件依赖),下面

[转]extern与头文件(*.h)的区别和联系

用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢?? 这个问题一直也是似是而非的困扰着我许久,经过实践和查找资料,有如下总结: 一.头文件 首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的. 我做过一个实验,

.c和.h文件的区别(头文件与之实现文件的的关系~ )

 .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定义在.h中. 函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误. 3楼: .h只做声明,编译后不产生代码   4楼: 这样做目的是为了实现软件的模块化 使软件结构清晰,而且也便于别人使用你写的程序 纯粹用 C 语言语法的角度,你当然可以在 .h

头文件&lt;assert.h&gt;

头文件<assert.h>的目的就是提供宏assert的定义.在程序中可以用这个宏来断言,如果断言是真,则继续执行.如果断言为假,则在标准输入流中输出一条提示信息,并执行终止异常. 通过宏DEBUG控制断言是否有效:如果程序中包含<assert.h>的地方没有定义NDEBUG,则宏assert为活动形式:如果程序中包含<assert.h>的地方定义了NDEBUG,则宏assert为静止形式.即: 当存在 #define NDEBUG #include <asser

成为C++高手之头文件与条件编译

书接上回(http://blog.csdn.net/niu_gao/article/details/51478789). 但现在看起来真不爽,main.c依赖的文件不能在工程中管理,要修改那些文件的话麻烦大了.如何既能分成多个文件又能在工程中看到呢?可以,使用头文件(h文件). 头文件中只放那些不产生内存占用的代码,比如定义结构(定义结构不会产生内存分配,只有用结构定义变量时才产生内存分配).定义枚举,定义宏,声明变量,声明函数等.而且大都是一个c文件对应一个h文件.下面增加poker.h和pl