2013-03-28 54 views
0

所以我有這個指針數組指向最多4個相同基類的對象。對象指針數組返回一個更多的值?

private: 
    Instance* paths[3]; 

如果我想指向一個對象,我將指向一個指向數組插槽的指針。如果沒有任何指向,則爲NULL。

我有這樣的設置功能做到這一點:

void Instance::setNearbyObjects(Instance* north,Instance* east,Instance* south,Instance* west) 
{ 
    paths[0]=north; 
    paths[1]=east; 
    paths[2]=south; 
    paths[3]=west; 
} 

我也有這個獲取函數,僅僅返回路徑數組:

Instance* Instance::getPaths() 
{ 
    return *paths; 
} 

然後我嘗試使用for循環週期通過該數組找到哪個插槽沒有NULL。基於此,我向用戶輸出了一些東西:

string nesw[4] = {"(N)orth","(E)ast","(S)outh","(W)est"}; 
for(int i=0;i<=(sizeof(current->getPaths());i++) 
{ 
    if(current[i].getPaths()!=NULL) 
    { 
     cout<<nesw[i].c_str()<<", "; 
    } 
} 

這就是奇怪的東西開始發生的地方。由於該回路的輸出是錯誤的,我寫了一個調試圈,看看究竟是什麼路徑數組裏面: 考慮這種情況: 我跑setNearbyObjects()函數將這些數據分配給路徑數組:

current->setNearbyObjects(NULL,objPointerA,objPointerB,NULL); 

然後運行這個循環打印輸出到控制檯屏幕:

for(int i=0;i<=sizeof(current->getPaths());i++) 
{ 
    cout<<current[i].getPaths()<<endl; 
} 

我預計產量爲這樣的:

00000000 
ABABABAB 
007E8F28 
00000000 

但它實際上是:

00000000 
ABABABAB 
007E8F28 
00000001 
ABABABAB 

路徑數組的長度是[3],4個槽。爲什麼循環返回5個地址?爲什麼第四個地址不爲空,當我將它設置爲NULL?

+1

當聲明是'[3]'僅存在3個時隙,而不是4.您正在訪問數組之外​​,這會導致未定義的行爲。 – Barmar 2013-03-28 06:23:11

+0

你的調試循環沒有任何意義。 'current'不是一個數組,爲什麼你使用'current [i] .getPaths()'? – Barmar 2013-03-28 06:38:04

+0

因爲... current-> getPaths()[i]給了我一個錯誤。我嘗試過這個。我看不到使用current [i] - > getPaths()的邏輯。 – eltaro 2013-03-28 09:05:57

回答

0

這裏有很多假設導致您的問題。

首先你聲明的數組只包含三個元素,而不是四個。

其次,您使用指針sizeof(current->getPaths())上的sizeof(),並期望獲取數組大小,您取而代之的是指針的大小(以字節爲單位)。你可以寫,而不是一個方法,它返回數組元素的數量甚至更好的使用向量來保存你的指針,所以當你需要的大小隻是檢查向量

std::vector<Instance*> paths; 

的大小...

paths.push_back(north); 
paths.push_back(east); 
paths.push_back(south); 
paths.push_back(west); 

甚至更​​好是使用共享指針(std::shared_ptr)的矢量,以便使所有權清楚和清理代碼保持爲最小

+0

^好的。我會盡力實現這一點。 – eltaro 2013-03-28 06:37:31

0

您需要將其聲明爲:如果你要4元(到3編號爲0)

Instance* paths[4]; 

+0

爲什麼?例如。在C#中,如果你想要4個插槽,你可以聲明路徑[3]。這裏爲什麼不同? – eltaro 2013-03-28 06:26:13

+0

好的。我將聲明更改爲Instance * paths [4]。再次運行循環,然後...返回5個項目still = _ =其中NULL指針的位置不是預期的位置。 – eltaro 2013-03-28 06:28:22

+0

我對C#不是很熟悉。但這[陣列教程](http://msdn.microsoft.com/en-us/library/aa288453(V = vs.71)的.aspx)沒有顯示在陣列的聲明在所有尺寸。 – Barmar 2013-03-28 06:29:18