update
This commit is contained in:
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;
|
||||
}
|
Reference in New Issue
Block a user