這元件算是智慧指標進一步的應用,Smart_Array 從 Smart_Ptr 繼承而來,再包裹一個叫 Smart_Array_Package 的物件,這個 Smart_Array_Package 可以包裹多種形式的陣列,包括一般 class、Smart_Ptr 或 Smart_Array,但不包括一般型別(int、long...)。Smart_Array 在使用上很直覺,和 C++ 陣列在用法上差不多。
和 C++ 陣列的元素要求一樣, class 要提供內定建構函數(無參數的建構函數)以及 public 區段的解構函數
範例一
#include <iostream>
#include <SMART_ARRAY.HPP>
using namespace std;
using namespace CxxlMan;
class A // 非 cxxlObject 的類別
{
const char *m_name;
public:
A(const char *name="123") // 須有可以不須參數的建構函數
{
m_name = name;
cout << m_name << " Constructor" << endl;
}
virtual ~A()
{
cout << m_name << " Destructor" << endl;
}
void Print() const
{
cout << m_name << " Print" << endl;
}
};
int main(int argc, char* argv[])
{
Smart_Array<A> A1_Array(3); // 3 個元素的陣列
Smart_Array<A> A2_Array; // 空陣列
if(A2_Array.isNULL()) // 繼承自 Smart_Ptr 的功能
A2_Array.Create(2); // 重建兩個元素的陣列
// 重建 5 個元素的陣列,原本的 Smart_Array_Package 會被放棄擁有
A1_Array.Create(5);
for(size_t i = 0; i < A1_Array.Length(); ++i)
A1_Array[2].Print(); // 像一般物件陣列一樣使用
system("pause");
return 0;
}
Smart_Ptr 陣列
記得 cxxlObject 要發揮它應有的能力須被放進 Smart_Ptr,而 Smart_Ptr 要能成為 Smsrt_Array 的元素,須要提供無參數的建構函數,所以沒法直接拿 Smart_Ptr 來用,須自己由 Smart_Ptr 延伸一個自定的智慧指標
#include <iostream>
#include <SMART_ARRAY.HPP>
using namespace std;
using namespace CxxlMan;
class A:virtual public cxxlObject
{
const char *m_name;
public:
A(const char *name = "123", ISpirit *spirit = Spirit_Easy)
:cxxlObject(spirit)
{
m_name = name;
cout << m_name << " Constructor" << endl;
}
virtual ~A()
{
cout << m_name << " Destructor" << endl;
}
void Print() const
{
cout << m_name << " Print" << endl;
}
};
// 只能用來包裹 class A
class MySmart_Ptr:public Smart_Ptr<A>
{
public:
MySmart_Ptr()
:Smart_Ptr<A>(new A("456")) // Smart_Ptr 不用指定 Host,Smart_Array 會處理
{
}
virtual ~MySmart_Ptr()
{
}
};
int main(int argc, char* argv[])
{
Smart_Array<MySmart_Ptr> A1_Array(3); // 3 個元素的陣列
Smart_Ptr<A> A2_Ptr = A1_Array[2]; // 這樣就能共享 class A
A2_Ptr->Print();
system("pause");
return 0;
}
多維陣列
實現多維的方式很簡單,只要在 Smart_Array 的 template 參數裡巢狀指定 Smart_Array 就能達到多維的的要求。
多維陣列可分為平齊和不平齊兩種,平齊是指陣列各維的長度都一樣,而不平齊是指各維的長度都可以單獨配置,先看看不平齊的例子:
範例三
// 沿用 範例二 的 class A int main(int argc, char* argv[]) { Smart_Array<Smart_Array<A> > A1_Array; // 二維空陣列 A1_Array.Create(2);
A1_Array[0].Create(3); // 最高註標 [0][2]
A1_Array[1].Create(4); // 最高註標 [1][3]
for(size_t i = 0; i < A1_Array.Length(); ++i)
for(size_t j = 0; j < A1_Array[i].Length(); ++j)
{
cout << "A1_Array[" << i << "][" << j << "] --> ";
A1_Array[i][j].Print();
}
system("pause");
return 0;
}
範例四
至於平齊陣列就不用自己一個個設定長度,使用 Smart_Array_Create() 這個輔助函數一次完成。
// 沿用 範例二 的 class A
int main(int argc, char* argv[])
{
Smart_Array<Smart_Array<Smart_Array<A> > > A1_Array; // 三維空陣列
// 建立 A1_Array[2][3][4]
Smart_Array_Create(&A1_Array,2,3,4, 0 ); // 註標的個數一定要和定義的陣列維數 // 一樣,最後加個 0 做結束識別
A1_Array[1][2][3].Print();
system("pause");
return 0;
}
引入檔 |
SMART_ARRAY.HPP |
程式庫 |
cxxlObject | |
|