我已经使用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;
}
然而,当我尝试执行它时,我收到错误: 无效使用不完整类型'类枪',我认为问题是我如何在标题中声明它,我做错了吗?我是怎么想的呢?感谢。
谢谢所有帮助过的人!我现在明白了,我以为只有前瞻宣言 进入头文件,谢谢你的所有答案!
答案 0 :(得分:3)
您似乎正在以错误的方式分离实现和头文件。前向声明不应该放在头文件中。整个声明应该!这就是你的代码应该如何构建
<强> Gun.hpp 强>
#pragma once
class Gun
{
private:
int stuff;
public:
void doStuff();
};
<强> Gun.cpp 强>
#include "Gun.hpp"
#include <iostream>
using std::cout;
using std::endl;
void Gun::doStuff()
{
cout << stuff << endl;
}
<强>的main.cpp 强>
int main()
{
Gun *mygun = new Gun;
mygun->doStuff();
delete mygun; // <-- remember this!
return 0;
}
在C ++和其他语言中,标题和实现的分离至关重要!您应该只在标题中声明该类及其完整接口(如上所述),并在.cpp文件中包含所有实现细节(如上所述:)
答案 1 :(得分:1)
gun
类的整个 声明需要位于头文件中。您在头文件中声明的是转发声明,这本身不足以创建该类的实例。前向声明对于允许其他代码仅声明指针非常有用,因为编译器不需要知道完整的细节来声明指针。但是前向声明不能用于创建类的实际对象实例。这就是您收到不完整类型的错误的原因。从main()
的角度来看,它不知道gun
实际上是什么样的,所以它无法创建它的完整实例。
gun
类的方法的实现需要在枪的源文件中,可以#include
头文件来验证和访问类成员。
gun.h
#ifndef gun_h
#define gun_h
class gun
{
private:
int stuff;
public:
void doStuff();
};
#endif
gun.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;
}
答案 2 :(得分:0)
在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