鱼C论坛

 找回密码
 立即注册
查看: 1545|回复: 8

[已解决]C++代码拆分后出现的问题

[复制链接]
发表于 2023-1-6 22:37:00 | 显示全部楼层 |阅读模式
5鱼币
本人小白,跟着网上找来的视频学C++,之前已经了解了C++的基本语法,今天看到视频里的一个把CPP文件中的类拆分成头文件和CPP文件的方式,结果尝试之后失败了,具体代码如下:

首先是原版代码:
  1. #include <iostream>

  2. using namespace std;

  3. // 点和圆的关系
  4. class Point
  5. {
  6. private:
  7.     int m_X, m_Y;

  8. public:
  9.     // 设置x
  10.     void setX(int x)
  11.     {
  12.         m_X = x;
  13.     }
  14.     // 获取x
  15.     int getX()
  16.     {
  17.         return m_X;
  18.     }
  19.     // 设置y
  20.     void setY(int y)
  21.     {
  22.         m_Y = y;
  23.     }
  24.     // 获取y
  25.     int getY()
  26.     {
  27.         return m_Y;
  28.     }
  29. };

  30. class Circle
  31. {
  32. private:
  33.     int m_R; // 半径

  34.     Point m_Center; // 圆心
  35. public:
  36.     // 设置半径
  37.     void setR(int r)
  38.     {
  39.         m_R = r;
  40.     }
  41.     // 获取半径
  42.     int getR()
  43.     {
  44.         return m_R;
  45.     }
  46.     // 设置圆心
  47.     void setCenter(Point center)
  48.     {
  49.         m_Center = center;
  50.     }
  51.     // 获取圆心
  52.     Point getCenter()
  53.     {
  54.         return m_Center;
  55.     }
  56. };

  57. // 判断点和圆关系
  58. void isInCircle(Circle &c, Point &p)
  59. {
  60.     // 计算亮点之间距离平方
  61.     int distance =
  62.         (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
  63.         (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());

  64.     // 计算半径的平方
  65.     int rDistance = c.getR() * c.getR();

  66.     // 判断关系
  67.     if (distance == rDistance)
  68.     {
  69.         cout << "点在圆上~" << endl;
  70.     }
  71.     else if (distance > rDistance)
  72.     {
  73.         cout << "点在圆外~" << endl;
  74.     }
  75.     else
  76.     {
  77.         cout << "点在圆内~" << endl;
  78.     }
  79. }

  80. int main()
  81. {
  82.     // 创建圆
  83.     Circle c;
  84.     c.setR(10);
  85.     Point center;
  86.     center.setX(10);
  87.     center.setY(0);
  88.     c.setCenter(center);

  89.     // 创建点
  90.     Point p;
  91.     p.setX(10);
  92.     p.setY(10);

  93.     // 判断关系
  94.     isInCircle(c, p);
  95. }
复制代码




以上代码因为都放到一个CPP文件里了,不利于后面做项目和扩展,所以做了拆分,分别拆成了两个头文件和两个CPP,以及一个main函数,具体如下:


“点”类的头文件:
  1. #pragma once
  2. #include <iostream>

  3. using namespace std;

  4. class Point
  5. {
  6. private:
  7.     int m_X, m_Y;

  8. public:
  9.     // 设置x
  10.     void setX(int x);
  11.     // 获取x
  12.     int getX();
  13.     // 设置y
  14.     void setY(int y);
  15.     // 获取y
  16.     int getY();
  17. };
复制代码


“点”类的方法体:
  1. #include "point.h"

  2. // 点和圆的关系
  3. // 设置x
  4. void Point::setX(int x)
  5. {
  6.     m_X = x;
  7. }
  8. // 获取x
  9. int Point::getX()
  10. {
  11.     return m_X;
  12. }
  13. // 设置y
  14. void Point::setY(int y)
  15. {
  16.     m_Y = y;
  17. }
  18. // 获取y
  19. int Point::getY()
  20. {
  21.     return m_Y;
  22. }
复制代码


“圆”类的头文件:
  1. #pragma once
  2. #include <iostream>
  3. #include "point.h"

  4. using namespace std;

  5. class Circle
  6. {
  7. private:
  8.     int m_R; // 半径

  9.     Point m_Center; // 圆心
  10. public:
  11.     // 设置半径
  12.     void setR(int r);
  13.     // 获取半径
  14.     int getR();
  15.     // 设置圆心
  16.     void setCenter(Point center);
  17.     // 获取圆心
  18.     Point getCenter();
  19. };
复制代码


“圆”类方法体:
  1. #include "circle.h"

  2. // 设置半径
  3. void Circle::setR(int r)
  4. {
  5.     m_R = r;
  6. }
  7. // 获取半径
  8. int Circle::getR()
  9. {
  10.     return m_R;
  11. }
  12. // 设置圆心
  13. void Circle::setCenter(Point center)
  14. {
  15.     m_Center = center;
  16. }
  17. // 获取圆心
  18. Point Circle::getCenter()
  19. {
  20.     return m_Center;
  21. }
复制代码


main方法:
  1. #include <iostream>
  2. #include "point.h"
  3. #include "circle.h"

  4. using namespace std;

  5. // 判断点和圆关系
  6. void isInCircle(Circle &c, Point &p)
  7. {
  8.     // 计算亮点之间距离平方
  9.     int distance =
  10.         (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
  11.         (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());

  12.     // 计算半径的平方
  13.     int rDistance = c.getR() * c.getR();

  14.     // 判断关系
  15.     if (distance == rDistance)
  16.     {
  17.         cout << "点在圆上~" << endl;
  18.     }
  19.     else if (distance > rDistance)
  20.     {
  21.         cout << "点在圆外~" << endl;
  22.     }
  23.     else
  24.     {
  25.         cout << "点在圆内~" << endl;
  26.     }
  27. }

  28. int main()
  29. {
  30.     // 创建圆
  31.     Circle c;
  32.     c.setR(10);
  33.     Point center;
  34.     center.setX(10);
  35.     center.setY(0);
  36.     c.setCenter(center);

  37.     // 创建点
  38.     Point p;
  39.     p.setX(10);
  40.     p.setY(10);

  41.     // 判断关系
  42.     isInCircle(c, p);
  43. }
复制代码


可最后执行的时候,蹦出了如下提示:
123.png


最后补充一句,视频里的老师,用的是微软的C++环境,我本地用的是 GCC 与 G++ 环境,不确定是不是因为环境问题导致,网上也不知道该怎么查,在此厚着脸皮向各位鱼油求教。。
最佳答案
2023-1-6 22:37:01
不确定是不是因为环境问题导致
是的,就是因为环境不一样

  1. sh-5.1$ ls
  2. circle.cpp  circle.h  main.cpp        point.cpp  point.h
  3. sh-5.1$ cat point.h
  4. // g++用这个
  5. #ifndef _POINT_H_
  6. #define _POINT_H_
  7. //#pragma once      // g++不用这个
  8. #include <iostream>

  9. using namespace std;

  10. class Point
  11. {
  12. private:
  13.     int m_X, m_Y;

  14. public:
  15.     // 设置x
  16.     void setX(int x);
  17.     // 获取x
  18.     int getX();
  19.     // 设置y
  20.     void setY(int y);
  21.     // 获取y
  22.     int getY();
  23. };
  24. #endif
  25. sh-5.1$ cat point.cpp
  26. #include "point.h"

  27. // 点和圆的关系
  28. // 设置x
  29. void Point::setX(int x)
  30. {
  31.     m_X = x;
  32. }
  33. // 获取x
  34. int Point::getX()
  35. {
  36.     return m_X;
  37. }
  38. // 设置y
  39. void Point::setY(int y)
  40. {
  41.     m_Y = y;
  42. }
  43. // 获取y
  44. int Point::getY()
  45. {
  46.     return m_Y;
  47. }
  48. sh-5.1$ cat circle.h
  49. #ifndef _CIRCLE_H_
  50. #define _CIRCLE_H_
  51. //#pragma once
  52. #include <iostream>
  53. #include "point.h"

  54. using namespace std;

  55. class Circle
  56. {
  57. private:
  58.     int m_R; // 半径

  59.     Point m_Center; // 圆心
  60. public:
  61.     // 设置半径
  62.     void setR(int r);
  63.     // 获取半径
  64.     int getR();
  65.     // 设置圆心
  66.     void setCenter(Point center);
  67.     // 获取圆心
  68.     Point getCenter();
  69. };
  70. #endif
  71. sh-5.1$ cat circle.cpp
  72. #include "circle.h"

  73. // 设置半径
  74. void Circle::setR(int r)
  75. {
  76.     m_R = r;
  77. }
  78. // 获取半径
  79. int Circle::getR()
  80. {
  81.     return m_R;
  82. }
  83. // 设置圆心
  84. void Circle::setCenter(Point center)
  85. {
  86.     m_Center = center;
  87. }
  88. // 获取圆心
  89. Point Circle::getCenter()
  90. {
  91.     return m_Center;
  92. }
  93. sh-5.1$ cat main.cpp
  94. #include <iostream>
  95. #include "point.h"
  96. #include "circle.h"

  97. using namespace std;

  98. // 判断点和圆关系
  99. void isInCircle(Circle &c, Point &p)
  100. {
  101.     // 计算亮点之间距离平方
  102.     int distance =
  103.         (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
  104.         (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());

  105.     // 计算半径的平方
  106.     int rDistance = c.getR() * c.getR();

  107.     // 判断关系
  108.     if (distance == rDistance)
  109.     {
  110.         cout << "点在圆上~" << endl;
  111.     }
  112.     else if (distance > rDistance)
  113.     {
  114.         cout << "点在圆外~" << endl;
  115.     }
  116.     else
  117.     {
  118.         cout << "点在圆内~" << endl;
  119.     }
  120. }

  121. int main()
  122. {
  123.     // 创建圆
  124.     Circle c;
  125.     c.setR(10);
  126.     Point center;
  127.     center.setX(10);
  128.     center.setY(0);
  129.     c.setCenter(center);

  130.     // 创建点
  131.     Point p;
  132.     p.setX(10);
  133.     p.setY(10);

  134.     // 判断关系
  135.     isInCircle(c, p);
  136. }
  137. sh-5.1$ ls
  138. circle.cpp  circle.h  main.cpp        point.cpp  point.h
  139. sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp
  140. sh-5.1$ ls
  141. circle.cpp  circle.h  main  main.cpp  point.cpp  point.h
  142. sh-5.1$
复制代码

最佳答案

查看完整内容

不确定是不是因为环境问题导致 是的,就是因为环境不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-6 22:37:01 | 显示全部楼层    本楼为最佳答案   
不确定是不是因为环境问题导致
是的,就是因为环境不一样

  1. sh-5.1$ ls
  2. circle.cpp  circle.h  main.cpp        point.cpp  point.h
  3. sh-5.1$ cat point.h
  4. // g++用这个
  5. #ifndef _POINT_H_
  6. #define _POINT_H_
  7. //#pragma once      // g++不用这个
  8. #include <iostream>

  9. using namespace std;

  10. class Point
  11. {
  12. private:
  13.     int m_X, m_Y;

  14. public:
  15.     // 设置x
  16.     void setX(int x);
  17.     // 获取x
  18.     int getX();
  19.     // 设置y
  20.     void setY(int y);
  21.     // 获取y
  22.     int getY();
  23. };
  24. #endif
  25. sh-5.1$ cat point.cpp
  26. #include "point.h"

  27. // 点和圆的关系
  28. // 设置x
  29. void Point::setX(int x)
  30. {
  31.     m_X = x;
  32. }
  33. // 获取x
  34. int Point::getX()
  35. {
  36.     return m_X;
  37. }
  38. // 设置y
  39. void Point::setY(int y)
  40. {
  41.     m_Y = y;
  42. }
  43. // 获取y
  44. int Point::getY()
  45. {
  46.     return m_Y;
  47. }
  48. sh-5.1$ cat circle.h
  49. #ifndef _CIRCLE_H_
  50. #define _CIRCLE_H_
  51. //#pragma once
  52. #include <iostream>
  53. #include "point.h"

  54. using namespace std;

  55. class Circle
  56. {
  57. private:
  58.     int m_R; // 半径

  59.     Point m_Center; // 圆心
  60. public:
  61.     // 设置半径
  62.     void setR(int r);
  63.     // 获取半径
  64.     int getR();
  65.     // 设置圆心
  66.     void setCenter(Point center);
  67.     // 获取圆心
  68.     Point getCenter();
  69. };
  70. #endif
  71. sh-5.1$ cat circle.cpp
  72. #include "circle.h"

  73. // 设置半径
  74. void Circle::setR(int r)
  75. {
  76.     m_R = r;
  77. }
  78. // 获取半径
  79. int Circle::getR()
  80. {
  81.     return m_R;
  82. }
  83. // 设置圆心
  84. void Circle::setCenter(Point center)
  85. {
  86.     m_Center = center;
  87. }
  88. // 获取圆心
  89. Point Circle::getCenter()
  90. {
  91.     return m_Center;
  92. }
  93. sh-5.1$ cat main.cpp
  94. #include <iostream>
  95. #include "point.h"
  96. #include "circle.h"

  97. using namespace std;

  98. // 判断点和圆关系
  99. void isInCircle(Circle &c, Point &p)
  100. {
  101.     // 计算亮点之间距离平方
  102.     int distance =
  103.         (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
  104.         (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());

  105.     // 计算半径的平方
  106.     int rDistance = c.getR() * c.getR();

  107.     // 判断关系
  108.     if (distance == rDistance)
  109.     {
  110.         cout << "点在圆上~" << endl;
  111.     }
  112.     else if (distance > rDistance)
  113.     {
  114.         cout << "点在圆外~" << endl;
  115.     }
  116.     else
  117.     {
  118.         cout << "点在圆内~" << endl;
  119.     }
  120. }

  121. int main()
  122. {
  123.     // 创建圆
  124.     Circle c;
  125.     c.setR(10);
  126.     Point center;
  127.     center.setX(10);
  128.     center.setY(0);
  129.     c.setCenter(center);

  130.     // 创建点
  131.     Point p;
  132.     p.setX(10);
  133.     p.setY(10);

  134.     // 判断关系
  135.     isInCircle(c, p);
  136. }
  137. sh-5.1$ ls
  138. circle.cpp  circle.h  main.cpp        point.cpp  point.h
  139. sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp
  140. sh-5.1$ ls
  141. circle.cpp  circle.h  main  main.cpp  point.cpp  point.h
  142. sh-5.1$
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-6 23:02:46 | 显示全部楼层
人造人 发表于 2023-1-6 22:43
不确定是不是因为环境问题导致
是的,就是因为环境不一样

感谢大佬支持,问题解决了,不过不知道是不是我 vscode 上装了什么还是 vscode 本身的问题,代码在codeblocks 上完美运行,在 vscode 上面又各种花式报错了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-6 23:04:07 | 显示全部楼层
foxiangzun 发表于 2023-1-6 23:02
感谢大佬支持,问题解决了,不过不知道是不是我 vscode 上装了什么还是 vscode 本身的问题,代码在codebl ...

发一下代码,发一下报错信息看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-6 23:10:16 | 显示全部楼层
人造人 发表于 2023-1-6 23:04
发一下代码,发一下报错信息看看

代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:

point.h
  1. #ifndef _POINT_H_
  2. #define _POINT_H_
  3. #include <iostream>

  4. using namespace std;

  5. class Point
  6. {
  7. private:
  8.     int m_X, m_Y;

  9. public:
  10.     // 设置x
  11.     void setX(int x);
  12.     // 获取x
  13.     int getX();
  14.     // 设置y
  15.     void setY(int y);
  16.     // 获取y
  17.     int getY();
  18. };
  19. #endif
复制代码



circle.h
  1. #ifndef _CIRCLE_H_
  2. #define _CIRCLE_H_
  3. #include <iostream>
  4. #include "point.h"

  5. using namespace std;

  6. class Circle
  7. {
  8. private:
  9.     int m_R; // 半径

  10.     Point m_Center; // 圆心
  11. public:
  12.     // 设置半径
  13.     void setR(int r);
  14.     // 获取半径
  15.     int getR();
  16.     // 设置圆心
  17.     void setCenter(Point center);
  18.     // 获取圆心
  19.     Point getCenter();
  20. };
  21. #endif
复制代码



然后报错又和上面的一样了,而且好像还多了几行。。

123.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-6 23:14:03 | 显示全部楼层
foxiangzun 发表于 2023-1-6 23:10
代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:

point.h

看编译命令,编译命令不对
看我发的代码,第154行

  1. sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-6 23:17:15 | 显示全部楼层
foxiangzun 发表于 2023-1-6 23:10
代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:

point.h

你现在的这个配置是单文件的情况
因为编译命令里面并没有把所有 .cpp 文件都写上
这是vscode ?重新配置一下vscode吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-6 23:21:12 | 显示全部楼层
foxiangzun 发表于 2023-1-6 23:10
代码按照阁下刚刚提供的那一套,只针对两个头文件做了修改,内容如下:

point.h

那个命令先用cd切一下目录,然后使用g++编译,然后运行
可以看到中间的那个 g++ 命令不对,那是单个文件的情况
多个文件,要把所有 .cpp 文件都写上
-g 用于调试
-Wall 启用警告
这两个选项也很有用,建议加上

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-6 23:24:21 | 显示全部楼层
人造人 发表于 2023-1-6 23:14
看编译命令,编译命令不对
看我发的代码,第154行

感谢指导,我再去查查 vscode 这个编译命令的配置,确实缺了一个 “-Wall”,而且好像文件也没包含全,我再查下吧,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-23 20:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表