CLion软件里 类的封装与打包,CMakelists设置

目录

题目

方法一(不将圆类和点类拆分成独自.cpp&.h文件)

项目目录结构

main.cpp 

CMakelists.txt设置:

方法二(将圆类和点类拆分成独自.cpp&.h文件)

项目目录结构

main.cpp

cricle.cpp

cricle.h

point.cpp

point.h

CMakelists.txt设置:


题目

CLion软件里 类的封装与打包,CMakelists设置_第1张图片
 


方法一(不将圆类和点类拆分成独自.cpp&.h文件)

项目目录结构

CLion软件里 类的封装与打包,CMakelists设置_第2张图片

main.cpp 

class Point {
private:
    int m_x;
    int m_y;
public:
    void setX(int x) {
        m_x = x;
    }

    void setY(int y) {
        m_y = y;
    }

    int getX() {
        return m_x;
    }

    int getY() {
        return m_y;
    }
};

class Circle {
private:
    double Pi = 3.1415;
    int m_R;
    Point m_centre;

public:
    void setR(int r) {
        m_R = r;
    }

    int getR() {
        return m_R;
    }

    void setCentre(Point ¢re) {
        m_centre = centre;
    }


    //利用成员函数判断两个立方体是否相等
    int isInCircle (Point &c) {
        double L = sqrt((c.getX() - m_centre.getX())*(c.getX() - m_centre.getX()) + (c.getY() - m_centre.getY())*(c.getY() - m_centre.getY()));
        if (m_R > L) {
            return 0;
        }
        else if (m_R == L) {
            return 1;
        }
        else {
            return 2;
        }
    }
};


int main() {
    Point Yuanx;
    Yuanx.setX(10);
    Yuanx.setY(10);
    Circle Y;
    Y.setR(8);
    Y.setCentre(Yuanx);

    Point D;
    D.setX(10);
    D.setY(3);


    int ret2 = Y.isInCircle(D);
    if (ret2 == 0) {
        cout << "点在圆内" <

CMakelists.txt设置:

cmake_minimum_required(VERSION 3.21)
project(Setion2)

#在windows上exe文件需要libgcc才能运行,修改CMAKElist文件,添加让链接器静态链接libgcc和libstdc++的指令
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")

include_directories(work)

add_executable(Setion3
        work/main.cpp
        work/main.h)

方法二(将圆类和点类拆分成独自.cpp&.h文件)

项目目录结构

CLion软件里 类的封装与打包,CMakelists设置_第3张图片

main.cpp

#include 
using namespace std;
#include "test/cricle.h"
#include "test/point.h"

int main() {
    Point Yuanx;
    Yuanx.setX(10);
    Yuanx.setY(10);
    Circle Y;
    Y.setR(8);
    Y.setCentre(Yuanx);

    Point D;
    D.setX(10);
    D.setY(3);


    int ret2 = Y.isInCircle(D);
    if (ret2 == 0) {
        cout << "点在圆内" <

cricle.cpp

#include "cricle.h"


void Circle::setR(int r) {
    m_R = r;
}

int Circle::getR() {
    return m_R;
}

void Circle::setCentre(Point ¢re) {
    m_centre = centre;
}


//利用成员函数判断两个立方体是否相等
int Circle::isInCircle (Point &c) {
    double L = sqrt((c.getX() - m_centre.getX())*(c.getX() - m_centre.getX()) + (c.getY() - m_centre.getY())*(c.getY() - m_centre.getY()));
    if (m_R > L) {
        return 0;
    }
    else if (m_R == L) {
        return 1;
    }
    else {
        return 2;
    }
}

cricle.h

#pragma once  
//为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifdef endif方式;另一种是#pragma once方式。

在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。
#include "point.h"
#include "math.h"

class Circle {

    private:
        int m_R;
        Point m_centre;

    public:
        void setR(int r);

        int getR();

        void setCentre(Point ¢re);


        //利用成员函数判断两个立方体是否相等
        int isInCircle (Point &c);

};

point.cpp

#include "point.h"
#pragma once

void Point::setX(int x) {
    m_x = x;
}

void Point::setY(int y) {
    m_y = y;
}

int Point::getX() {
    return m_x;
}

int Point::getY() {
    return m_y;
}

point.h

#pragma once
//为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifdef endif方式;另一种是#pragma once方式。

class Point {
private:
    int m_x;
    int m_y;
public:
    void setX(int x);

    void setY(int y);

    int getX();

    int getY();
};

CMakelists.txt设置:

cmake_minimum_required(VERSION 3.21)
project(Setion3)

#在windows上exe文件需要libgcc才能运行,修改CMAKElist文件,添加让链接器静态链接libgcc和libstdc++的指令
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")

#1 编译静态库
#这一步需要将项目目录路径work/test下的源文件编译为静态库,那么需要获取编译此静态库需要的文件列表,可以使用set命令,或者file命令来进行设置。比如:
file(GLOB_RECURSE TEST_LIB_SRC
        work/test/*.cpp
        )

#通过add_library命令编译名为test的静态库,库的类型是第二个参数STATIC指定的。如果指定为SHARED则编译的就是动态链接库。
add_library(test STATIC ${TEST_LIB_SRC})

#通过add_executable命令来往构建系统中添加一个可执行构建目标,同样需要指定编译需要的源文件。但是对于可执行文件来说,有时候还会依赖其他的库,则需要使用target_link_libraries命令来声明构建此可执行文件需要链接的库。
#在示例项目中,main.cpp就使用了work/test下实现的一些函数接口,所以依赖于前面构建的test库。所以在CMakeLists.txt中添加以下内容:

add_executable(demo work/main.cpp)
target_link_libraries(demo test)
#第一行说明编译可执行文件demo需要的源文件(可以指定多个源文件,此处只是以单个文件作为示例);第二行表明对math库存在依赖。

#[[
目录格式:
---Section3
    --CMakeLists.txt
    --work
        --test
            -cricle.cpp
            -cricle.h
            -point.cpp
            -point.h
        --main.cpp

项目的构建任务为:

将test目录编译成静态库,命名为test
编译main.cpp为可执行文件命名为demo,依赖test静态库
]]

你可能感兴趣的:(c++,算法)