P2 C++ 编程范式

章节 链接
代码链接

2.1.1 C++ 工程的一般组织结构

一般情况下,C++工程的组织结构是将不同的功能封装在不同的类中,每个类用配套的头文件源文件来实现,头文件可以是*.h*.hpp之类的文件,源文件可以是*.cc*.cpp之类的文件。最后在 main 函数中,调用类来实现具体的功能。

2.1.2 C++ 工程在机器人中的组织结构

在机器人项目中,C++ 工程代码通常分成两个部分:一个部分用于实现具体算法,另一个部分用于进行 ROS 接口封装
ROS 接口负责数据输入、数据输出以及核心算法调用

2.2 C++ 代码的编译

3 种 编译工具: g++、make、CMake

foo.h

// 宏定义  防止头文件 重复包含与编译
#ifndef FOO_H_
#define FOO_H_

#include <string>

// 命名空间设置  防止出现 重复的函数与变量
namespace foo{
    class MyPrint{
        // 声明类 具体函数实现 在 foo.cpp 中
    public:
        MyPrint(std::string output); // 构造函数
        void ExcutePrint();

        std::string output_;
    };
}
#endif

foo.cpp

#include "foo.h" // 首先在 当前目录 下搜索需要包含的文件
#include <iostream> // 首先在系统头文件目录中搜索需要包含的文件
#include <string>
// 
// 如果是标准库函数的头文件,则使用<>包含头文件;如果是自定义的头文件,优先使用" "包含头文件。

namespace foo{
    MyPrint::MyPrint(std::string output):output_(output){
        std::cout << "class MyPrint create a object!";
        std::cout << std::endl;
    }
    void MyPrint::ExcutePrint(){
        std::cout << output_ << std::endl;
    }
}

main.cpp

#include "foo.h"

int main(int argc, char** argv){
    // 创建 类 MyPrint 的实例对象, 并传入 初始化参数
    foo::MyPrint my_print("I can output string!");
    my_print.ExcutePrint(); //  调用 对象中的成员函数
    return 0;
}

2.2.1 g++ 编译

若未安装 g++:sudo apt install g++
已安装则跳过。

预处理、编译、汇编、连接。

g++ foo.cpp main.cpp -o demo
./demo

2.2.2 make 编译

makefile

start: # 命令块 命名  下面的命令后不能加注释。 是直接在 命令行界面 运行的指令
	g++ -o foo.o -c foo.cpp  
	g++ -o main.o -c main.cpp 
	g++ -o demo foo.o main.o 
clean: 	# 删除 中间文件 
	rm -rf foo.o main.o

✅ 2.2.3 CMake 编译

CMake可以自动处理程序之间的关系,并产生对应的 makefile 文件,然后调用 make 就可以编译了。

CMakeLists.txt

# 声明 CMake 的最低版本
cmake_minimum_required(VERSION 2.8)

# 声明 CMake 工程名
project(demo)

include_directories("${PROJECT_BINARY_DIR}")

# 创建库文件
add_library (foo foo.cpp)
# 创建 可执行文件
add_executable (demo main.cpp)
# 为 可执行文件 连接依赖库
target_link_libraries (demo foo)

在 源文件 所在目录 打开命令行窗口。

mkdir build
cd build 
cmake ..
make 
./demo

C++ 编程风格 可参考:https://github.com/google/styleguide?tab=readme-ov-file

posted @   扎根deshu  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示