update
This commit is contained in:
parent
468a49850d
commit
f98a4ce2c2
23
README.md
23
README.md
@ -1,8 +1,8 @@
|
|||||||
# C++那些事
|
# C++那些事
|
||||||
|
|
||||||
## 项目概要
|
### 0.项目概要
|
||||||
|
|
||||||
学习C++内容,包括理论、源码、实践、项目等
|
学习C++内容,包括理论、源码、实践、课程代码、项目等
|
||||||
|
|
||||||
### 1.基础部分
|
### 1.基础部分
|
||||||
|
|
||||||
@ -127,12 +127,25 @@ for(decl:col) {
|
|||||||
- [myhashtable](./stl_src/myhashtable.md)
|
- [myhashtable](./stl_src/myhashtable.md)
|
||||||
- [unordered_map](./stl_src/unordered_map.md)
|
- [unordered_map](./stl_src/unordered_map.md)
|
||||||
|
|
||||||
|
### 3.学习课程
|
||||||
|
|
||||||
### 3.代码运行
|
#### 3.1 [极客时间《现代C++实战30讲》](https://time.geekbang.org/channel/home)
|
||||||
|
|
||||||
全部在Ubuntu18.04下用vim编写,使用gcc/g++调试!全部可正常运行!
|
- [堆、栈、RAII:C++里该如何管理资源?](./morden_C++_30)
|
||||||
|
- [堆与栈](./morden_C++_30/RAII/heap_stack.cpp)
|
||||||
|
- [RAII](./morden_C++_30/RAII/RAII.cpp)
|
||||||
|
|
||||||
## 关于作者:
|
### 4.代码运行
|
||||||
|
|
||||||
|
- **代码环境**
|
||||||
|
|
||||||
|
Ubuntu 18.04
|
||||||
|
|
||||||
|
- **工具**
|
||||||
|
|
||||||
|
CLion gcc/g++
|
||||||
|
|
||||||
|
### 5.关于作者:
|
||||||
|
|
||||||
个人公众号:
|
个人公众号:
|
||||||
|
|
||||||
|
7
morden_C++_30/CMakeLists.txt
Normal file
7
morden_C++_30/CMakeLists.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14)
|
||||||
|
project(Morden_C++)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
|
||||||
|
add_executable(heap_stack_RAII RAII/heap_stack.cpp)
|
||||||
|
add_executable(RAII RAII/RAII.cpp)
|
96
morden_C++_30/RAII/RAII.cpp
Normal file
96
morden_C++_30/RAII/RAII.cpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <mutex>
|
||||||
|
#include <fstream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
enum class shape_type {
|
||||||
|
circle,
|
||||||
|
triangle,
|
||||||
|
rectangle,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class shape {
|
||||||
|
public:
|
||||||
|
shape() { cout << "shape" << endl; }
|
||||||
|
|
||||||
|
virtual void print() {
|
||||||
|
cout << "I am shape" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~shape() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class circle : public shape {
|
||||||
|
public:
|
||||||
|
circle() { cout << "circle" << endl; }
|
||||||
|
|
||||||
|
void print() {
|
||||||
|
cout << "I am circle" << endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class triangle : public shape {
|
||||||
|
public:
|
||||||
|
triangle() { cout << "triangle" << endl; }
|
||||||
|
|
||||||
|
void print() {
|
||||||
|
cout << "I am triangle" << endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class rectangle : public shape {
|
||||||
|
public:
|
||||||
|
rectangle() { cout << "rectangle" << endl; }
|
||||||
|
|
||||||
|
void print() {
|
||||||
|
cout << "I am rectangle" << endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 利用多态 上转 如果返回值为shape,会存在对象切片问题。
|
||||||
|
shape *create_shape(shape_type type) {
|
||||||
|
switch (type) {
|
||||||
|
case shape_type::circle:
|
||||||
|
return new circle();
|
||||||
|
case shape_type::triangle:
|
||||||
|
return new triangle();
|
||||||
|
case shape_type::rectangle:
|
||||||
|
return new rectangle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class shape_wrapper {
|
||||||
|
public:
|
||||||
|
explicit shape_wrapper(shape *ptr = nullptr) : ptr_(ptr) {}
|
||||||
|
|
||||||
|
~shape_wrapper() {
|
||||||
|
delete ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
shape *get() const {
|
||||||
|
return ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
shape *ptr_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void foo() {
|
||||||
|
shape_wrapper ptr(create_shape(shape_type::circle));
|
||||||
|
ptr.get()->print();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
// 第一种方式
|
||||||
|
shape *sp = create_shape(shape_type::circle);
|
||||||
|
sp->print();
|
||||||
|
delete sp;
|
||||||
|
|
||||||
|
// 第二种方式
|
||||||
|
foo();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
38
morden_C++_30/RAII/heap_stack.cpp
Normal file
38
morden_C++_30/RAII/heap_stack.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class bar {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// java 程序员风格
|
||||||
|
void foo() {
|
||||||
|
cout << "method 1" << endl;
|
||||||
|
bar *ptr = new bar();
|
||||||
|
delete ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bar *make_bar() {
|
||||||
|
bar *ptr = nullptr;
|
||||||
|
try {
|
||||||
|
ptr = new bar();
|
||||||
|
} catch (...) {
|
||||||
|
delete ptr;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
// 独立出函数 分配和释放不在一个函数里
|
||||||
|
void foo1() {
|
||||||
|
cout << "method 2" << endl;
|
||||||
|
bar *ptr = make_bar();
|
||||||
|
delete ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
foo();
|
||||||
|
foo1();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user