From e511db807dde38891fe333e1729805cce34bb5a6 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 17 Apr 2026 16:05:12 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=20C++=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 24 ++++++ README.md | 61 +++++++++++++- include/app.hpp | 87 ++++++++++++++++++++ src/app.cpp | 64 +++++++++++++++ src/main.cpp | 63 +++++++++++++++ tests/basic_test.cpp | 189 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 487 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt create mode 100644 include/app.hpp create mode 100644 src/app.cpp create mode 100644 src/main.cpp create mode 100644 tests/basic_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..be6aa48 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.10) +project(SimpleCppProject VERSION 1.0.0 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# 输出目录 +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) + +# 包含目录 +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +# 主程序 +add_executable(main_app src/main.cpp src/app.cpp) + +# 测试程序 +add_executable(basic_test tests/basic_test.cpp src/app.cpp) + +# 安装目标(可选) +install(TARGETS main_app RUNTIME DESTINATION bin) +install(TARGETS basic_test RUNTIME DESTINATION bin) \ No newline at end of file diff --git a/README.md b/README.md index a31daa7..70e65d4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,61 @@ -# 未命名 +# Simple C++ CMake Project +这是一个简单的 C++17 项目,使用 CMake 构建系统。 + +## 项目结构 + +``` +├── CMakeLists.txt # CMake 配置文件 +├── README.md # 项目说明文档 +├── include/ +│ └── app.hpp # 应用程序头文件 +├── src/ +│ ├── app.cpp # 应用程序实现 +│ └── main.cpp # 主程序入口 +└── tests/ + └── basic_test.cpp # 基本测试 +``` + +## 编译步骤 + +### 1. 创建构建目录 +```bash +mkdir build +cd build +``` + +### 2. 配置 CMake +```bash +cmake .. +``` + +### 3. 编译项目 +```bash +cmake --build . +``` + +或者使用平台特定的编译命令: +```bash +make # Linux/macOS +``` + +### 4. 运行主程序 +编译完成后,可执行文件位于 `build/bin/` 目录下: + +```bash +# 运行主程序 +./build/bin/main_app + +# 运行测试 +./build/bin/basic_test +``` + +## 功能说明 + +- **main_app**: 主程序,演示基本的应用程序功能 +- **basic_test**: 基本测试程序,验证核心功能 + +## 依赖要求 + +- CMake 3.10 或更高版本 +- 支持 C++17 的编译器(如 GCC 7+, Clang 5+, MSVC 2017+) \ No newline at end of file diff --git a/include/app.hpp b/include/app.hpp new file mode 100644 index 0000000..5cc2ec8 --- /dev/null +++ b/include/app.hpp @@ -0,0 +1,87 @@ +#ifndef SIMPLE_APP_HPP +#define SIMPLE_APP_HPP + +#include +#include + +/** + * @brief 简单的应用程序类,提供基本功能 + */ +class SimpleApp { +public: + /** + * @brief 构造函数 + * @param name 应用程序名称 + */ + explicit SimpleApp(const std::string& name); + + /** + * @brief 获取应用程序名称 + * @return 应用程序名称 + */ + std::string getName() const; + + /** + * @brief 设置应用程序名称 + * @param name 新的应用程序名称 + */ + void setName(const std::string& name); + + /** + * @brief 添加一个数字到列表中 + * @param number 要添加的数字 + */ + void addNumber(int number); + + /** + * @brief 获取所有数字的总和 + * @return 数字总和 + */ + int getSum() const; + + /** + * @brief 获取数字列表 + * @return 数字列表的引用 + */ + const std::vector& getNumbers() const; + + /** + * @brief 清空所有数字 + */ + void clearNumbers(); + + /** + * @brief 获取应用程序信息 + * @return 格式化的应用程序信息字符串 + */ + std::string getInfo() const; + +private: + std::string appName; + std::vector numbers; +}; + +/** + * @brief 计算两个整数的和 + * @param a 第一个整数 + * @param b 第二个整数 + * @return 两数之和 + */ +int add(int a, int b); + +/** + * @brief 计算两个整数的乘积 + * @param a 第一个整数 + * @param b 第二个整数 + * @return 两数之积 + */ +int multiply(int a, int b); + +/** + * @brief 生成欢迎消息 + * @param name 用户名 + * @return 欢迎消息 + */ +std::string generateWelcomeMessage(const std::string& name); + +#endif // SIMPLE_APP_HPP \ No newline at end of file diff --git a/src/app.cpp b/src/app.cpp new file mode 100644 index 0000000..3122327 --- /dev/null +++ b/src/app.cpp @@ -0,0 +1,64 @@ +#include "app.hpp" +#include +#include + +SimpleApp::SimpleApp(const std::string& name) : appName(name) { +} + +std::string SimpleApp::getName() const { + return appName; +} + +void SimpleApp::setName(const std::string& name) { + appName = name; +} + +void SimpleApp::addNumber(int number) { + numbers.push_back(number); +} + +int SimpleApp::getSum() const { + if (numbers.empty()) { + return 0; + } + return std::accumulate(numbers.begin(), numbers.end(), 0); +} + +const std::vector& SimpleApp::getNumbers() const { + return numbers; +} + +void SimpleApp::clearNumbers() { + numbers.clear(); +} + +std::string SimpleApp::getInfo() const { + std::ostringstream oss; + oss << "Application: " << appName << "\n"; + oss << "Numbers count: " << numbers.size() << "\n"; + oss << "Sum of numbers: " << getSum() << "\n"; + + if (!numbers.empty()) { + oss << "Numbers: "; + for (size_t i = 0; i < numbers.size(); ++i) { + if (i > 0) { + oss << ", "; + } + oss << numbers[i]; + } + } + + return oss.str(); +} + +int add(int a, int b) { + return a + b; +} + +int multiply(int a, int b) { + return a * b; +} + +std::string generateWelcomeMessage(const std::string& name) { + return "Welcome, " + name + "! This is a simple C++ application."; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..2d2b044 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,63 @@ +#include "app.hpp" +#include +#include + +int main() { + std::cout << "=== Simple C++ Application Demo ===\n\n"; + + // 演示基本函数 + std::cout << "1. Basic function demonstrations:\n"; + std::cout << " add(5, 3) = " << add(5, 3) << "\n"; + std::cout << " multiply(4, 6) = " << multiply(4, 6) << "\n"; + std::cout << " Message: " << generateWelcomeMessage("User") << "\n\n"; + + // 创建应用程序实例 + SimpleApp app("DemoApp"); + + // 演示应用程序功能 + std::cout << "2. Application instance operations:\n"; + std::cout << " Initial app name: " << app.getName() << "\n"; + + // 添加一些数字 + app.addNumber(10); + app.addNumber(20); + app.addNumber(30); + app.addNumber(40); + + // 显示应用程序信息 + std::cout << "\n After adding numbers:\n"; + std::cout << " " << app.getInfo() << "\n"; + + // 修改应用程序名称 + app.setName("UpdatedApp"); + std::cout << "\n After updating name:\n"; + std::cout << " New app name: " << app.getName() << "\n"; + + // 添加更多数字 + app.addNumber(50); + std::cout << "\n After adding 50:\n"; + std::cout << " Sum: " << app.getSum() << "\n"; + + // 清空数字并重新开始 + app.clearNumbers(); + std::cout << "\n After clearing numbers:\n"; + std::cout << " Numbers count: " << app.getNumbers().size() << "\n"; + + // 重新添加一些数字 + for (int i = 1; i <= 5; ++i) { + app.addNumber(i * i); // 添加平方数 + } + + std::cout << "\n After adding squares 1-5:\n"; + std::cout << " " << app.getInfo() << "\n\n"; + + // 最终总结 + std::cout << "3. Summary:\n"; + std::cout << " Application demo completed successfully.\n"; + std::cout << " Total numbers processed: " << app.getNumbers().size() << "\n"; + std::cout << " Final sum: " << app.getSum() << "\n"; + + std::cout << "\n=== End of Demo ===\n"; + + return 0; +} \ No newline at end of file diff --git a/tests/basic_test.cpp b/tests/basic_test.cpp new file mode 100644 index 0000000..b7bc056 --- /dev/null +++ b/tests/basic_test.cpp @@ -0,0 +1,189 @@ +#include "app.hpp" +#include +#include + +/** + * @brief 测试 add 函数 + */ +void testAddFunction() { + std::cout << "Testing add function...\n"; + + // 测试基本加法 + assert(add(0, 0) == 0); + assert(add(5, 3) == 8); + assert(add(-5, 10) == 5); + assert(add(-3, -7) == -10); + + // 测试边界情况 + assert(add(100, 200) == 300); + + std::cout << " add function tests passed!\n"; +} + +/** + * @brief 测试 multiply 函数 + */ +void testMultiplyFunction() { + std::cout << "Testing multiply function...\n"; + + // 测试基本乘法 + assert(multiply(0, 5) == 0); + assert(multiply(5, 3) == 15); + assert(multiply(-5, 3) == -15); + assert(multiply(-4, -5) == 20); + + // 测试边界情况 + assert(multiply(10, 10) == 100); + + std::cout << " multiply function tests passed!\n"; +} + +/** + * @brief 测试 SimpleApp 类的基本功能 + */ +void testSimpleAppBasic() { + std::cout << "Testing SimpleApp basic functionality...\n"; + + // 测试构造函数和getter + SimpleApp app("TestApp"); + assert(app.getName() == "TestApp"); + + // 测试setter + app.setName("RenamedApp"); + assert(app.getName() == "RenamedApp"); + + // 测试添加数字和求和 + assert(app.getSum() == 0); // 初始和为0 + assert(app.getNumbers().empty()); + + app.addNumber(10); + assert(app.getSum() == 10); + assert(app.getNumbers().size() == 1); + assert(app.getNumbers()[0] == 10); + + app.addNumber(20); + assert(app.getSum() == 30); + assert(app.getNumbers().size() == 2); + + std::cout << " SimpleApp basic tests passed!\n"; +} + +/** + * @brief 测试 SimpleApp 类的数字管理功能 + */ +void testSimpleAppNumberManagement() { + std::cout << "Testing SimpleApp number management...\n"; + + SimpleApp app("NumberApp"); + + // 添加多个数字 + for (int i = 1; i <= 5; ++i) { + app.addNumber(i * 10); + } + + // 验证数字 + const auto& numbers = app.getNumbers(); + assert(numbers.size() == 5); + assert(numbers[0] == 10); + assert(numbers[1] == 20); + assert(numbers[2] == 30); + assert(numbers[3] == 40); + assert(numbers[4] == 50); + + // 验证总和 + assert(app.getSum() == 150); // 10+20+30+40+50 = 150 + + // 测试清空功能 + app.clearNumbers(); + assert(app.getNumbers().empty()); + assert(app.getSum() == 0); + + // 重新添加并验证 + app.addNumber(100); + app.addNumber(200); + assert(app.getSum() == 300); + assert(app.getNumbers().size() == 2); + + std::cout << " SimpleApp number management tests passed!\n"; +} + +/** + * @brief 测试 generateWelcomeMessage 函数 + */ +void testWelcomeMessage() { + std::cout << "Testing generateWelcomeMessage function...\n"; + + std::string msg1 = generateWelcomeMessage("Alice"); + assert(msg1.find("Alice") != std::string::npos); + assert(msg1.find("Welcome") != std::string::npos); + + std::string msg2 = generateWelcomeMessage("Bob"); + assert(msg2.find("Bob") != std::string::npos); + + std::string msg3 = generateWelcomeMessage(""); + assert(msg3.find("Welcome") != std::string::npos); + + std::cout << " Welcome message tests passed!\n"; +} + +/** + * @brief 测试 SimpleApp 的信息生成功能 + */ +void testAppInfo() { + std::cout << "Testing SimpleApp info generation...\n"; + + SimpleApp app("InfoApp"); + + // 空应用的信息 + std::string emptyInfo = app.getInfo(); + assert(emptyInfo.find("InfoApp") != std::string::npos); + assert(emptyInfo.find("Numbers count: 0") != std::string::npos); + + // 添加数字后的信息 + app.addNumber(1); + app.addNumber(2); + app.addNumber(3); + + std::string fullInfo = app.getInfo(); + assert(fullInfo.find("InfoApp") != std::string::npos); + assert(fullInfo.find("Numbers count: 3") != std::string::npos); + assert(fullInfo.find("Sum of numbers: 6") != std::string::npos); + assert(fullInfo.find("1, 2, 3") != std::string::npos); + + std::cout << " App info generation tests passed!\n"; +} + +/** + * @brief 主测试函数 + */ +int main() { + std::cout << "=== Starting Basic Tests ===\n\n"; + + try { + testAddFunction(); + std::cout << "\n"; + + testMultiplyFunction(); + std::cout << "\n"; + + testWelcomeMessage(); + std::cout << "\n"; + + testSimpleAppBasic(); + std::cout << "\n"; + + testSimpleAppNumberManagement(); + std::cout << "\n"; + + testAppInfo(); + + std::cout << "\n=== All Tests Passed! ===\n"; + return 0; + } catch (const std::exception& e) { + std::cerr << "Test failed with exception: " << e.what() << "\n"; + return 1; + } catch (...) { + std::cerr << "Test failed with unknown exception\n"; + return 1; + } +} \ No newline at end of file