C++代码拆分后出现的问题
本人小白,跟着网上找来的视频学C++,之前已经了解了C++的基本语法,今天看到视频里的一个把CPP文件中的类拆分成头文件和CPP文件的方式,结果尝试之后失败了,具体代码如下:首先是原版代码:
#include <iostream>
using namespace std;
// 点和圆的关系
class Point
{
private:
int m_X, m_Y;
public:
// 设置x
void setX(int x)
{
m_X = x;
}
// 获取x
int getX()
{
return m_X;
}
// 设置y
void setY(int y)
{
m_Y = y;
}
// 获取y
int getY()
{
return m_Y;
}
};
class Circle
{
private:
int m_R; // 半径
Point m_Center; // 圆心
public:
// 设置半径
void setR(int r)
{
m_R = r;
}
// 获取半径
int getR()
{
return m_R;
}
// 设置圆心
void setCenter(Point center)
{
m_Center = center;
}
// 获取圆心
Point getCenter()
{
return m_Center;
}
};
// 判断点和圆关系
void isInCircle(Circle &c, Point &p)
{
// 计算亮点之间距离平方
int distance =
(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
// 计算半径的平方
int rDistance = c.getR() * c.getR();
// 判断关系
if (distance == rDistance)
{
cout << "点在圆上~" << endl;
}
else if (distance > rDistance)
{
cout << "点在圆外~" << endl;
}
else
{
cout << "点在圆内~" << endl;
}
}
int main()
{
// 创建圆
Circle c;
c.setR(10);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center);
// 创建点
Point p;
p.setX(10);
p.setY(10);
// 判断关系
isInCircle(c, p);
}
以上代码因为都放到一个CPP文件里了,不利于后面做项目和扩展,所以做了拆分,分别拆成了两个头文件和两个CPP,以及一个main函数,具体如下:
“点”类的头文件:
#pragma once
#include <iostream>
using namespace std;
class Point
{
private:
int m_X, m_Y;
public:
// 设置x
void setX(int x);
// 获取x
int getX();
// 设置y
void setY(int y);
// 获取y
int getY();
};
“点”类的方法体:
#include "point.h"
// 点和圆的关系
// 设置x
void Point::setX(int x)
{
m_X = x;
}
// 获取x
int Point::getX()
{
return m_X;
}
// 设置y
void Point::setY(int y)
{
m_Y = y;
}
// 获取y
int Point::getY()
{
return m_Y;
}
“圆”类的头文件:
#pragma once
#include <iostream>
#include "point.h"
using namespace std;
class Circle
{
private:
int m_R; // 半径
Point m_Center; // 圆心
public:
// 设置半径
void setR(int r);
// 获取半径
int getR();
// 设置圆心
void setCenter(Point center);
// 获取圆心
Point getCenter();
};
“圆”类方法体:
#include "circle.h"
// 设置半径
void Circle::setR(int r)
{
m_R = r;
}
// 获取半径
int Circle::getR()
{
return m_R;
}
// 设置圆心
void Circle::setCenter(Point center)
{
m_Center = center;
}
// 获取圆心
Point Circle::getCenter()
{
return m_Center;
}
main方法:
#include <iostream>
#include "point.h"
#include "circle.h"
using namespace std;
// 判断点和圆关系
void isInCircle(Circle &c, Point &p)
{
// 计算亮点之间距离平方
int distance =
(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
// 计算半径的平方
int rDistance = c.getR() * c.getR();
// 判断关系
if (distance == rDistance)
{
cout << "点在圆上~" << endl;
}
else if (distance > rDistance)
{
cout << "点在圆外~" << endl;
}
else
{
cout << "点在圆内~" << endl;
}
}
int main()
{
// 创建圆
Circle c;
c.setR(10);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center);
// 创建点
Point p;
p.setX(10);
p.setY(10);
// 判断关系
isInCircle(c, p);
}
可最后执行的时候,蹦出了如下提示:
最后补充一句,视频里的老师,用的是微软的C++环境,我本地用的是 GCC 与 G++ 环境,不确定是不是因为环境问题导致,网上也不知道该怎么查,在此厚着脸皮向各位鱼油求教。。 不确定是不是因为环境问题导致
是的,就是因为环境不一样
sh-5.1$ ls
circle.cppcircle.hmain.cpp point.cpppoint.h
sh-5.1$ cat point.h
// g++用这个
#ifndef _POINT_H_
#define _POINT_H_
//#pragma once // g++不用这个
#include <iostream>
using namespace std;
class Point
{
private:
int m_X, m_Y;
public:
// 设置x
void setX(int x);
// 获取x
int getX();
// 设置y
void setY(int y);
// 获取y
int getY();
};
#endif
sh-5.1$ cat point.cpp
#include "point.h"
// 点和圆的关系
// 设置x
void Point::setX(int x)
{
m_X = x;
}
// 获取x
int Point::getX()
{
return m_X;
}
// 设置y
void Point::setY(int y)
{
m_Y = y;
}
// 获取y
int Point::getY()
{
return m_Y;
}
sh-5.1$ cat circle.h
#ifndef _CIRCLE_H_
#define _CIRCLE_H_
//#pragma once
#include <iostream>
#include "point.h"
using namespace std;
class Circle
{
private:
int m_R; // 半径
Point m_Center; // 圆心
public:
// 设置半径
void setR(int r);
// 获取半径
int getR();
// 设置圆心
void setCenter(Point center);
// 获取圆心
Point getCenter();
};
#endif
sh-5.1$ cat circle.cpp
#include "circle.h"
// 设置半径
void Circle::setR(int r)
{
m_R = r;
}
// 获取半径
int Circle::getR()
{
return m_R;
}
// 设置圆心
void Circle::setCenter(Point center)
{
m_Center = center;
}
// 获取圆心
Point Circle::getCenter()
{
return m_Center;
}
sh-5.1$ cat main.cpp
#include <iostream>
#include "point.h"
#include "circle.h"
using namespace std;
// 判断点和圆关系
void isInCircle(Circle &c, Point &p)
{
// 计算亮点之间距离平方
int distance =
(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
// 计算半径的平方
int rDistance = c.getR() * c.getR();
// 判断关系
if (distance == rDistance)
{
cout << "点在圆上~" << endl;
}
else if (distance > rDistance)
{
cout << "点在圆外~" << endl;
}
else
{
cout << "点在圆内~" << endl;
}
}
int main()
{
// 创建圆
Circle c;
c.setR(10);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center);
// 创建点
Point p;
p.setX(10);
p.setY(10);
// 判断关系
isInCircle(c, p);
}
sh-5.1$ ls
circle.cppcircle.hmain.cpp point.cpppoint.h
sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp
sh-5.1$ ls
circle.cppcircle.hmainmain.cpppoint.cpppoint.h
sh-5.1$
人造人 发表于 2023-1-6 22:43
不确定是不是因为环境问题导致
是的,就是因为环境不一样
感谢大佬支持,问题解决了,不过不知道是不是我 vscode 上装了什么还是 vscode 本身的问题,代码在codeblocks 上完美运行,在 vscode 上面又各种花式报错了。。{:9_229:} foxiangzun 发表于 2023-1-6 23:02
感谢大佬支持,问题解决了,不过不知道是不是我 vscode 上装了什么还是 vscode 本身的问题,代码在codebl ...
发一下代码,发一下报错信息看看
人造人 发表于 2023-1-6 23:04
发一下代码,发一下报错信息看看
代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:
point.h
#ifndef _POINT_H_
#define _POINT_H_
#include <iostream>
using namespace std;
class Point
{
private:
int m_X, m_Y;
public:
// 设置x
void setX(int x);
// 获取x
int getX();
// 设置y
void setY(int y);
// 获取y
int getY();
};
#endif
circle.h
#ifndef _CIRCLE_H_
#define _CIRCLE_H_
#include <iostream>
#include "point.h"
using namespace std;
class Circle
{
private:
int m_R; // 半径
Point m_Center; // 圆心
public:
// 设置半径
void setR(int r);
// 获取半径
int getR();
// 设置圆心
void setCenter(Point center);
// 获取圆心
Point getCenter();
};
#endif
然后报错又和上面的一样了,而且好像还多了几行。。
foxiangzun 发表于 2023-1-6 23:10
代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:
point.h
看编译命令,编译命令不对
看我发的代码,第154行
sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp
foxiangzun 发表于 2023-1-6 23:10
代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:
point.h
你现在的这个配置是单文件的情况
因为编译命令里面并没有把所有 .cpp 文件都写上
这是vscode ?重新配置一下vscode吧
foxiangzun 发表于 2023-1-6 23:10
代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:
point.h
那个命令先用cd切一下目录,然后使用g++编译,然后运行
可以看到中间的那个 g++ 命令不对,那是单个文件的情况
多个文件,要把所有 .cpp 文件都写上
-g 用于调试
-Wall 启用警告
这两个选项也很有用,建议加上
人造人 发表于 2023-1-6 23:14
看编译命令,编译命令不对
看我发的代码,第154行
感谢指导,我再去查查 vscode 这个编译命令的配置,确实缺了一个 “-Wall”,而且好像文件也没包含全,我再查下吧,谢谢{:9_232:}
页:
[1]