头文件中的类声明
Class declarations in header files
我已经使用 c++ 几个月了,但是当我使用头文件和源代码文件时,我遇到了错误。我创建了一个源代码文件包含一个类枪(示例不是实际程序(:
class gun
{
private:
int stuff;
public:
void doStuff();
};
void Gun::doStuff()
{
cout << stuff << endl;
}
然后我创建了一个头文件并像这样声明该类:
class gun;
然后在我的主源文件中,我这样做:
int main()
{
gun *mygun = new gun;
mygun->doStuff();
return 0;
}
但是当我尝试执行它时,出现错误:无效使用不完整类型的"类枪",我认为问题是我如何在标题中声明它,我做错了吗?我该怎么做?谢谢。
感谢所有帮助过的人!我现在明白了,我以为只有前向声明 进入头文件,感谢您的所有回答!
您似乎以错误的方式将实现和头文件分开。转发声明不应放在头文件中。整个宣言应该!这就是你的代码应该如何构建
枪.hpp
#pragma once
class Gun
{
private:
int stuff;
public:
void doStuff();
};
枪.cpp
#include "Gun.hpp"
#include <iostream>
using std::cout;
using std::endl;
void Gun::doStuff()
{
cout << stuff << endl;
}
主.cpp
int main()
{
Gun *mygun = new Gun;
mygun->doStuff();
delete mygun; // <-- remember this!
return 0;
}
标头和实现的分离在C++和其他语言中至关重要!您应该只在标头中声明该类及其完整接口(如上所述(,并在.cpp文件中包含所有实现详细信息(如上:)
gun
类的整个声明需要位于头文件中。 您在头文件中声明的是前向声明,它本身不足以创建类的实例。 前向声明对于仅允许其他代码声明指针很有用,因为编译器不需要知道完整的详细信息来声明指针。 但是前向声明不能用于创建类的实际对象实例。 这就是您收到有关不完整类型的错误的原因。 从main()
的角度来看,它不知道gun
实际是什么样子的,所以它无法创建它的完整实例。
gun
类的方法的实现需要在 gun 的源文件中,该文件可以#include
头文件来验证和访问类成员。
枪.H
#ifndef gun_h
#define gun_h
class gun
{
private:
int stuff;
public:
void doStuff();
};
#endif
枪.cpp
#include "gun.h"
#include <iostream>
void gun::doStuff()
{
std::cout << stuff << std::endl;
}
现在,在main()
(或任何其他源文件(中,您可以#include
头文件并根据需要使用该类:
#include "gun.h"
int main()
{
gun *mygun = new gun;
mygun->doStuff();
delete mygun;
return 0;
}
In gun.h
#ifndef GUN_H_
#define GUN_H_
// You can use #pragma once too here
class gun
{
private:
int stuff;
public:
void doStuff();
};
#endif
在gun.cpp
文件中
#include "gun.h"
void gun::doStuff()
{
cout << stuff << endl;
}
然后main.cpp
#include "gun.h"
int main() {
//your code using the class
gun *mygun = new gun;
mygun->doStuff();
return 0;
}
您可以使用
g++ -o prg_name gun.cpp main.cpp && ./prg_name
相关文章:
- .cpp和.h文件中的模板专用化声明
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 用"=default"声明的函数应该只在头文件中执行
- 调用在 HXX 文件中声明的静态数据成员
- 如何在 c++ 的不同文件中声明类?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 声明要在 qml 和 cpp 文件中使用的全局字符串
- 在.cpp文件之间传递结构声明,而不使用全局头文件
- 为什么要将函数声明和定义放在单独的文件中
- 枚举前向声明与头文件
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在带有类型保护的模板文件中使用前向声明
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 当我可以在头文件中声明和定义所有文件时,为什么要创建一个.cpp文件?
- 文件存在时的最新检查声明生成输入"is missing"
- 在实现文件中使用模板参数声明方法
- 包含文件中的 Typdef "未在此范围内声明"
- 带有正向声明的Co-Dependent.h文件
- 无法声明文件指针数组