前向声明问题 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的成员变量或函数
-问候
高塔姆
所以我试图在我的 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的成员变量或函数-问候 高塔姆