c++ - 将此类分离为头文件和 cpp 文件
问题描述
我很难将这个类分成头文件和 .cpp 文件,因为 c++ 对我来说相对较新。这门课是我的老师在课堂上和我们一起编程的一个例子。这不是家庭作业,但它会帮助我理解我的家庭作业。
#include <iostream>
#include <AstUtils.h>
#include <vector>
#include <cassert>
#include <Vector2.h>
#define WIDTH 1377
#define HEIGHT 768
using namespace std;
using namespace astu;
class Stone {
public:
Stone(double x = 0, double y = 0)
: x(x), y(y), vx(0), vy(0)
{
//empty
}
void SetPos(double x, double y){
this->x = x;
this->y = y;
}
void Render() {
SetRenderColor(255,0,0);
RenderRectangle(x,y,20,20,true);
}
double GetPosX() const {
return x;
}
double GetPosY() const {
return y;
}
void SetVel(double vx, double vy){
this->vx = vx;
this->vy = vy;
}
void SetAcc(double ax, double ay){
this->ax = ax;
this->ay = ay;
}
void Update(double dt) {
x += vx*dt;
y += vy*dt;
vx += ax*dt;
vy += ay*dt;
ax = 0;
ay = 0;
}
private:
double x,y;
double vx, vy;
double ax, ay;
};
void PlotCurve(vector<double> & vertices) {
assert(vertices.size() % 2 == 0);
assert(vertices.size() >= 4);
auto it = vertices.begin();
double x1 = *it++;
double y1 = *it++;
while(it != vertices.end()){
double x2 = *it++;
double y2 = *it++;
RenderLine(x1,y1, x2, y2);
x1 = x2;
y1 = y2;
}
}
void ReportError()
{
std::cout << "An error has occured: " << GetLastErrorMessage() << std::endl;
std::cout << GetErrorDetails() << std::endl;
}
int main()
{
if (InitApp(WIDTH,HEIGHT, "Demo") != NO_ERROR) {
ReportError();
return -1;
}
Vector2<double> center(WIDTH/2, HEIGHT/2);
Stone stone(WIDTH * 0.3, HEIGHT/2);
stone.SetVel(100, -150);
vector<double> posCurve;
posCurve.push_back(stone.GetPosX());
posCurve.push_back(stone.GetPosY());
while(!IsAppTerminated()) {
ClearCanvas();
Vector2 p(stone.GetPosX(), stone.GetPosY());
Vector2 d = center - p;
double dist = d.LengthSquared();
d.Normalize();
d *= 50000000 / dist;
stone.SetAcc(d.x,d.y);
stone.Update(GetDeltaTime());
stone.Render();
posCurve.push_back(stone.GetPosX());
posCurve.push_back(stone.GetPosY());
SetRenderColor(255,255,255);
PlotCurve(posCurve);
UpdateApp();
}
QuitApp();
}
这是我尝试过的:
(不知道如何定义构造函数并且对此也有问题,因为变量在标题中。)
.cpp:
Stone::Stone(double x = 0, double y = 0)
: x(x), y(y), vx(0), vy(0)
{}
void SetPos(double x, double y){
this->x = x;
this->y = y;
}
void Render() {
SetRenderColor(255,0,0);
RenderRectangle(x,y,20,20,true);
}
double GetPosX() const {
return x;
}
double GetPosY() const {
return y;
}
void SetVel(double vx, double vy){
this->vx = vx;
this->vy = vy;
}
void SetAcc(double ax, double ay){
this->ax = ax;
this->ay = ay;
}
void Update(double dt) {
x += vx*dt;
y += vy*dt;
vx += ax*dt;
vy += ay*dt;
ax = 0;
ay = 0;
}
。H:
class Stone{
public:
Stone(double x = 0, double y = 0);
void SetPos(double x, double y);
void Render();
double GetPosX();
double GetPosY();
void SetVel(double vx, double vy);
void SetAcc(double ax, double ay);
void Update(double dt);
private:
double x,y;
double vx, vy;
double ax, ay;
};
解决方案
您不一定需要将所有实现移动到.cpp
文件中。当它足够短并且不使用类外部的任何对象时,您可以将.hpp
文件中的实现作为内联函数保留。getPosX
对于像or这样的成员尤其如此getPosY
。内联这样的成员是一种空间增益,但也可能导致更快的代码。
我通常保留可以在一行上编写的类声明函数,如下所示:
double GetPosX() const { return x; }
double GetPosY() const { return y; }
但是,如果该函数需要包含另一个标头,我将实现移动到.cpp
文件中,以尽可能避免包含在标头中:
double GetPosX() const;
double GetPosY() const;
在.cpp
:
#include AnotherClass.hpp
double Stone::GetPosX() const { return anotherClass.x; }
double Stone::GetPosY() const { return anotherClass.y; }
对于构造函数,您可以将其保留在标头中,尤其是在它为空的情况下,如您的示例中所示:
Stone(double x = 0, double y = 0) : x(x), y(y), vx(0), vy(0)
{}
但是,如果它是一个更复杂的实现,你也应该移动它:
// In the header
Stone(double x = 0, double y = 0);
// In the cpp
Stone::Stone(double x, double y) : x(x), y(y), vx(0), vy(0)
{
//Complex implementation of the constructor
}
推荐阅读
- php - Laravel 8 传递多个参数来查看
- beautifulsoup - 提取 HTML 标签 Beautifulsoup
- database-design - DynamoDB - 间接多对多关系
- angular - 防止多次提交有角度的排气图
- azure-data-factory - 为什么数据流接收器缓存没有所有数据预览结果?
- excel - 在excel中找到平均值但每个单元格的最大值
- swift - UISearchController setActive 什么都不做
- swift - 忽略安全区域中的安全区域
- python - 如何在另一个窗口中随时通过按键跳出循环?
- reactjs - 如何在 MUI 5 中使用美元符号 ($) 覆盖样式?