c++數組引用一二

本文是關於今天遇到的問題的經驗之談,不成系統,沒有娓娓道來,只是留個印象免得日後重蹈覆轍。

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

[email protected]

發佈了31 篇原創文章 · 獲贊 18 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章