核心元件‎ > ‎

陣列

這元件算是智慧指標進一步的應用,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

  
Comments