鱼C论坛

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

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

[复制链接]
发表于 2023-1-6 22:37:00 | 显示全部楼层 |阅读模式
5鱼币
本人小白,跟着网上找来的视频学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);
}

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


最后补充一句,视频里的老师,用的是微软的C++环境,我本地用的是 GCC 与 G++ 环境,不确定是不是因为环境问题导致,网上也不知道该怎么查,在此厚着脸皮向各位鱼油求教。。
最佳答案
2023-1-6 22:37:01
不确定是不是因为环境问题导致
是的,就是因为环境不一样
sh-5.1$ ls
circle.cpp  circle.h  main.cpp        point.cpp  point.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.cpp  circle.h  main.cpp        point.cpp  point.h
sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp
sh-5.1$ ls
circle.cpp  circle.h  main  main.cpp  point.cpp  point.h
sh-5.1$

最佳答案

查看完整内容

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

使用道具 举报

发表于 2023-1-6 22:37:01 | 显示全部楼层    本楼为最佳答案   
不确定是不是因为环境问题导致
是的,就是因为环境不一样
sh-5.1$ ls
circle.cpp  circle.h  main.cpp        point.cpp  point.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.cpp  circle.h  main.cpp        point.cpp  point.h
sh-5.1$ g++ -g -Wall -o main main.cpp circle.cpp point.cpp
sh-5.1$ ls
circle.cpp  circle.h  main  main.cpp  point.cpp  point.h
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
#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


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

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

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> 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-12-25 23:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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