foxiangzun 发表于 2023-1-6 22:37:00

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++ 环境,不确定是不是因为环境问题导致,网上也不知道该怎么查,在此厚着脸皮向各位鱼油求教。。

人造人 发表于 2023-1-6 22:37:01

不确定是不是因为环境问题导致
是的,就是因为环境不一样

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$

foxiangzun 发表于 2023-1-6 23:02:46

人造人 发表于 2023-1-6 22:43
不确定是不是因为环境问题导致
是的,就是因为环境不一样

感谢大佬支持,问题解决了,不过不知道是不是我 vscode 上装了什么还是 vscode 本身的问题,代码在codeblocks 上完美运行,在 vscode 上面又各种花式报错了。。{:9_229:}

人造人 发表于 2023-1-6 23:04:07

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

发一下代码,发一下报错信息看看

foxiangzun 发表于 2023-1-6 23:10:16

人造人 发表于 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


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

人造人 发表于 2023-1-6 23:14:03

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

point.h


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

sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp

人造人 发表于 2023-1-6 23:17:15

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

point.h


你现在的这个配置是单文件的情况
因为编译命令里面并没有把所有 .cpp 文件都写上
这是vscode ?重新配置一下vscode吧

人造人 发表于 2023-1-6 23:21:12

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

point.h


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

foxiangzun 发表于 2023-1-6 23:24:21

人造人 发表于 2023-1-6 23:14
看编译命令,编译命令不对
看我发的代码,第154行

感谢指导,我再去查查 vscode 这个编译命令的配置,确实缺了一个 “-Wall”,而且好像文件也没包含全,我再查下吧,谢谢{:9_232:}
页: [1]
查看完整版本: C++代码拆分后出现的问题