前向声明问题 class

Issue with forward declaring class

所以我试图在我的 C++ 项目中转发声明一个 class,然后在 main 中创建它。

所以我有 player_obj.cpp,其中包含 class,classes.h,前向声明 class,main.cpp 使用它。

classes.h

#ifndef CLASSES_H
#define CLASSES_H

class player_class
{
    public:

        int x;
        int y;
        char sprite;
        int xprevious;
        int yprevious;

    private:

        bool active;

    public:

        void update_xy();
        player_class(int _x, int _y, char _sprite);
        void step();
        void destroy();
};

#endif

main.cpp

#include <iostream>
#include "classes.h"
using namespace std;

int main()
{
    player_class player_obj (5,5,'#');
    cout << player_obj.x << ", " << player_obj.y << endl;
    return 0;
}

和player_obj.cpp

#include <iostream>
#include <Windows.h>
using namespace std;

class player_class
{
    public:

        //Coordinates
        int x;
        int y;

        //Sprite
        char sprite;

        //Previous coordinates
        int xprevious;
        int yprevious;

    //Not everyone can set the activity
    private:

        //Active
        bool active;

    //Update xprevious and yprevious - Called by the step event
    void update_xy()
    {
        xprevious = x;
        yprevious = y;
    }

    //All functions public  
    public:

        //Create event/Constructer
        player_class(int _x, int _y, char _sprite)
        {
            //Set default variables
            x = _x;
            y = _y;
            sprite = _sprite;
            xprevious = x;
            yprevious = y;
            active = true;
        }

        //Step event
        void step()
        {
            //Update old xprevious and yprevious
            update_xy();

            //Do other stuff here

        }

        //Drestroy event
        void destroy()
        {
            active = false;
        }
};

我认为这会很好,但是当我编译并 运行 它时,我得到:

main.cpp:(.text+0x2c): undefined reference to`player_class::player_class(int, int, char)'

我做了一些研究,但我似乎无法解决这个问题。

非常感谢任何帮助!

好吧,你有点接近了,你在 header 中的内容确实是一个 class 声明(注意你不是前向声明)。

问题是你从来没有定义过它。 player_obj.cpp 中的内容是对 class 重新定义的憎恶,但您已经声明了 class。只需包含 header 文件并一一定义功能即可!

    #include "classes.h"

    player_class::player_class(int _x, int _y, char _sprite)
    {
        //Set default variables
        x = _x;
        y = _y;
        sprite = _sprite;
        xprevious = x;
        yprevious = y;
        active = true;
    }

    // and so on

如果您真的想学习现代 C++,请注意以下几点:

  • #pragma once 是保护 header 文件的现代方式。不要使用那些 #ifdef..#endif 结构。
  • 一般来说,不要命名任何以下划线开头的东西。尤其是作为 public 合同的一部分可见的参数。
  • 你有 class 个初始值设定项是有原因的,使用它们!您不需要在构造函数中复制粘贴变量的半屏。

您不需要前向声明。你想要一份声明。这是在 header 文件中声明 class 并在 cpp 文件中定义其函数的 class 典型案例。然后包括 header where-ever 你想用你的 class

只有当您想使用指向 class 的指针作为某个函数或成员变量的参数但 class 的定义尚不可用时,您才需要前向声明。 注意当你前向声明一个class时,你不能在那个header

中使用这个class的成员变量或函数

-问候 高塔姆