diff --git a/03_day.pptx b/03_day.pptx index 225393e..c23f656 100644 Binary files a/03_day.pptx and b/03_day.pptx differ diff --git a/03_day/sp/Android.bp b/03_day/sp/Android.bp new file mode 100644 index 0000000..0e8bf69 --- /dev/null +++ b/03_day/sp/Android.bp @@ -0,0 +1,7 @@ +cc_binary { + name: "my_sp", + shared_libs: ["liblog", "libutils"], + srcs: [ + "sp_1.cpp", + ], +} diff --git a/03_day/sp/a.out b/03_day/sp/a.out index 7c513b6..a4c8bd2 100644 Binary files a/03_day/sp/a.out and b/03_day/sp/a.out differ diff --git a/03_day/sp/sp.cpp b/03_day/sp/sp.cpp index e7dbdd3..f6f49d6 100644 --- a/03_day/sp/sp.cpp +++ b/03_day/sp/sp.cpp @@ -1,6 +1,74 @@ #if 1 #include +class RefBase +{ + int mRefs; + public: + RefBase():mRefs(0) { printf("RefBase::RefBase()\n"); } + virtual ~RefBase() { printf("RefBase::~RefBase()\n"); } + void incStrong() { + printf("RefBase::incStrong() : mRefs=%d\n", ++mRefs); + } + void decStrong() + { + --mRefs; + printf("RefBase::decStrong() : mRefs=%d\n", mRefs); + if( mRefs == 0 ) + delete this; + } +}; +class AAA : public virtual RefBase +{ + public: + AAA(){ printf("AAA::AAA()\n"); } + ~AAA() { printf("AAA::~AAA()\n"); } + void foo() { printf("AAA::foo()\n"); } +}; + +template < typename T > +class sp +{ + T *mPtr; + public: + sp( T *ptr):mPtr(ptr) { + printf("sp::sp(T)\n"); + mPtr->incStrong(); + } + sp( const sp &r ) : mPtr(r.mPtr) { + printf("sp::sp(sp)\n"); + mPtr->incStrong(); + } + + ~sp() { + printf("sp::~sp()\n"); + mPtr->decStrong(); + } + + T * operator->() + { + return mPtr; + } + T operator*() + { + return *mPtr; + } +}; + +int main() +{ + { + sp p1 = new AAA; + sp p2 = p1; + p1->foo(); + p2->foo(); + } + return 0; +} +#endif +#if 0 +#include + class AAA { int mRefs; diff --git a/03_day/sp/sp_1.cpp b/03_day/sp/sp_1.cpp new file mode 100644 index 0000000..ca1ff55 --- /dev/null +++ b/03_day/sp/sp_1.cpp @@ -0,0 +1,82 @@ +#if 1 +#include +#include +#include + +using namespace android; + +class AAA; +class BBB; + +class AAA : public virtual RefBase +{ + public: + wp pb; + AAA(){ printf("AAA::AAA()\n"); } + ~AAA() { printf("AAA::~AAA()\n"); } + void foo() { printf("AAA::foo()\n"); } +}; +class BBB : public virtual RefBase +{ + public: + wp pa; + BBB(){ printf("BBB::BBB()\n"); } + ~BBB() { printf("BBB::~BBB()\n"); } + void foo() { printf("BBB::foo()\n"); } +}; + +int main() +{ + { + sp p1 = new AAA; + sp p2 = new BBB; + p1->pb = p2; + p2->pa = p1; + } + return 0; +} +#endif + + + +#if 0 +#include +#include +#include + +using namespace android; + +class AAA; +class BBB; + +class AAA : public virtual RefBase +{ + public: + sp pb; + AAA(){ printf("AAA::AAA()\n"); } + ~AAA() { printf("AAA::~AAA()\n"); } + void foo() { printf("AAA::foo()\n"); } +}; +class BBB : public virtual RefBase +{ + public: + sp pa; + BBB(){ printf("BBB::BBB()\n"); } + ~BBB() { printf("BBB::~BBB()\n"); } + void foo() { printf("BBB::foo()\n"); } +}; + +int main() +{ + { + sp p1 = new AAA; + sp p2 = new BBB; + p1->pb = p2; + p2->pa = p1; + } + return 0; +} +#endif + + +