头文件中的类声明

时间:2016-02-06 05:13:24

标签: c++ class

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

然而,当我尝试执行它时,我收到错误: 无效使用不完整类型'类枪',我认为问题是我如何在标题中声明它,我做错了吗?我是怎么想的呢?感谢。

谢谢所有帮助过的人!我现在明白了,我以为只有前瞻宣言  进入头文件,谢谢你的所有答案!

3 个答案:

答案 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