头文件中的类声明

Class declarations in header files

本文关键字:声明 文件      更新时间:2023-10-16

我已经使用 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