本文是關於今天遇到的問題的經驗之談,不成系統,沒有娓娓道來,只是留個印象免得日後重蹈覆轍。
C++可以使用數組引用來對數組參數進行安全檢查,但是在類的內部使用數組的引用的時候經常會犯這樣的問題:
typedef int (&DV3)[3];
class directionVector
{
public:
directionVector(DV3 param);
DV3 dv;
}
對,如你所見,directionVector 是個存儲向量的類,爲了既能對構造參數進行安全檢查又圖省事兒,向量數據竟然存儲在了一個引用裏!!結果就是dv是一個對局部變量的引用,而這個局部變量隨時可能被清理並被新的數據覆蓋,這就像局部變量的指針一樣可怕。如下列代碼所示,
class directionVector
{
public:
directionVector(DV3 param);
DV3 dv;
};
directionVector::directionVector(DV3 param)
:dv(param)
{ }
directionVector* newclass()
{
int intarray[3] = {1,1,1};
cout<<intarray<<endl; // 打印intarray地址
directionVector *ptr = new directionVector(intarray);
return ptr;
}
int _tmain(int argc, _TCHAR* argv[])
{
directionVector *ptr = newclass();
cout<<ptr->dv<<endl; // 打印ptr->dv的地址
getchar();
return 0;
}
打印結果截圖:
爲了避免這樣的結果,需要在類directionVector中開闢一塊空間用來存儲向量數據,對類重新進行一下定義:
class directionVector
{
public:
directionVector(DV3 param);
DV3 dv;
private:
int data[3];
};
directionVector::directionVector(DV3 param)
:dv(data)
{
dv[0] = param[0];
dv[1] = param[1];
dv[2] = param[2];
}
問題解決了,現在有了一個12字節可以用於安全讀取和修改的data數組,但是新的問題也緊隨其後,爲了存儲一個12字節的向量我們卻一共耗費了16個字節(dv+data[3]),而且如果類的內部如果有很多類似data的數組,既需要提供安全檢查,又需要存儲數據的話無疑dv對的空間佔用無疑是不小的代價。
dv是爲了對參數進行安全檢查而出現的衍生品,那麼就需要可以對dv下手,將參數安全檢查的責任從directionVector剝離開來,重新進行如下定義
// test
//
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef int (&DV3)[3];
class directionVector;
class directionVector
{
public:
friend directionVector* newDV(DV3 param);
private:
directionVector() {}
directionVector(DV3 param);
private:
int data[3];
};
directionVector::directionVector(DV3 param)
{
data[0] = param[0];
data[1] = param[1];
data[2] = param[2];
}
directionVector* newDV(DV3 param)
{
directionVector *ptr = new directionVector(param);
return ptr;
}
int _tmain(int argc, _TCHAR* argv[])
{
int array[3] = {1,2,3};
directionVector *ptr = newDV(array);
cout<<sizeof(directionVector)<<endl;
getchar();
return 0;
}
這樣一來 directionVector 的構造和參數檢查全由newDV(...) 函數全權負責。
,又或者可以直接刪掉成員dv,在構造函數中使用param對data直接賦值也可以。
呵呵。我太水了。
結束。
funte