C 语言面向接口编程

通过函数指针实现多态,注册回调函数的方式 void printAllArray(void* arr, int eleSize, int len, void(*myPrint)(void*)){ char* arrStart = (char*)arr; for(int i = 0; i < len; ++i){ char* eleStart = arrStart + i * eleSize; myPrint(eleStart); } printf("\n"); } void printInt(void* data){ int* ele = (int*)data; printf("%d ", *ele); } struct Person{ char name[64]; int age; }; void printPerson(void* data){ struct Person* ele = (struct Person*)data; printf("Name: %s, Age: %d \n", ele->name, ele->age); } int main() { int arr[] = {1, 2, 3, 4, 5}; printAllArray(arr, sizeof(int), 5, printInt); struct Person personArr[] = { {"aaa", 20}, {"bbb", 30}, {"ccc", 40}, {"ddd", 50}, {"eee", 60}, }; printAllArray(personArr, sizeof(struct Person), 5, printPerson); return 0; } 输出:...

January 10, 2022 · 1 min · Rick Cui

面向抽象类编程

三层架构:业务逻辑层、抽象层、实现层 原则:依赖倒转 案例一:动物园 设计实现: 抽象层:Animal 提供接口 voice 实现层:Dog、Cat 分别实现 voice ,发出不同的声音 业务层:main 函数调用,只通过 Animal 的指针统一实现业务 案例二:编写一个 C++ 程序, 计算程序员( programmer )工资 要求能计算出初级程序员( junior_programmer ) 中级程序员 ( mid_programmer )高级程序员( adv_programmer )的工资 要求利用抽象类统一界面,方便程序的扩展,比如:新增,计算架构师( architect ) 的工资 设计实现: 抽象层:Programmer 提供计算工资的接口 实现层:JuniorProgrammer、MidProgrammer、AdvProgrammer 分别对计算工资接口进行实现 业务层:通过 Programmer 类统一管理,实现业务逻辑,同时业务的可扩展性更强,如新增架构师类型 案例三:电脑组装,面向抽象层编程 组装电脑有 3 个抽象类,抽象的 cpu,抽象的显卡,抽象的内存。 现在要求组装两台电脑,一台是 Intel 的 CPU,Intel 的显卡和 Intel 的内存。另一台是 Intel 的 CPU、Nvidia 的显卡和 Kingston 的内存条。 针对抽象层编程。 设计实现:...

January 9, 2022 · 1 min · Rick Cui

实现一个简单的字符串类

MyString.h #ifndef __MYSTRING_H_ #define __MYSTRING_H_ #include <stdlib.h>#include <iostream>#include <cstring> using namespace std; class MyString { // 重载 << // 最好是 const 的,可以输出匿名变量(匿名变量不能被非 const 的左值引用接收) friend ostream& operator<<(ostream &os, const MyString &s); // 重载 >> friend istream& operator>>(istream &is, MyString &s); private: // 字符串的有效长度 int m_len; // 字符串指针 char* m_pStr; public: MyString(); MyString(const char *); MyString(const MyString &); ~MyString(); // 重载 = MyString& operator=(const MyString &); // 重载 [] char& operator[](int index); // 重载 + MyString operator+(const MyString &); // 重载 += MyString& operator+=(const MyString &); // 重载 == bool operator==(const MyString &); // 重载 !...

January 8, 2022 · 3 min · Rick Cui

静态数组初始化

1. 声明静态数组后一定要进行初始化,否则里面的值都是未知的 int main() { int ia[3] = {0}; // 这虽然只是给第一个元素赋了值,但剩余未赋值的元素都会初始化为0 char ca[3] = {0}; double da[3]; bool ba[3]; short sa[3]; float fa[3]; for(auto & i : da){ cout << i << endl; } return 0; } 输出: 6.95128e-310 4.63759e-310 0 2. C++ 数组指针和数组类型 数组类型和数组指针(数组名)不是一种类型,只是恰好指向的地址相同而已 数组名是指针常量(int * const),代表数组中第一个元素的地址 数组类型代表整个数组 int main() { int arr[10]; cout << arr << endl; cout << arr + 1 << endl; cout << "----------" << endl; cout << &arr << endl; cout << &arr + 1 << endl; return 0; } 输出:...

January 8, 2022 · 2 min · Rick Cui

VS Code 搭建 c++ gdb 开发环境

一、安装 C++ 开发环境 Using GCC with MinGW 安装 MSYS2 更新 MSYS2 pacman -Syu 在开始菜单中运行 MSYS2 MSYS,更新其余的基本包 pacman -Su 安装 C++ 开发环境: clang++ x64 gdb: pacman -S --needed base-devel mingw-w64-ucrt-x86_64-clang mingw-w64-ucrt-x86_64-gdb g++ gdb: pacman -S --needed base-devel mingw-w64-x86_64-toolchain clang++ lldb: pacman -S --needed base-devel mingw-w64-clang-x86_64-lldb 这个库会把 clang clang++ 等库安装到 msys64/clang64/bin 目录,但是 lldb 在 Windows 上的调试效果不如 gdb clang++ x86:pacman -S --needed base-devel mingw-w64-i686-clang 添加环境变量 D:\msys64\ucrt64\bin 检查是否安装成功 clang++ --version g++ --version gdb --version pacman -Syu // 更新整个系统 pacman -Su // 更新已安装的包 pacman -Ss 关键字 // 搜索含关键字的包 pacman -S 包名 // 安装包,也可以同时安装多个包,只需以空格分隔包名即可 pacman -Rs 包名 // 删除包及其依赖 pacman -R 包名 // 删除包 二、配置 VS Code 主要是修改 task....

January 6, 2022 · 2 min · Rick Cui