2013-10-08 32 views
-5

我正在爲C++類製作遊戲,並且遇到指針問題。爲了給物品裝備物品,我爲不同的可穿戴物品類型創建了8個指針。我還創建了一個名爲noItem的類,它繼承了所有的項目類型,並將所有屬性初始化爲零。當我創建我的角色時,我創建了一個noItem實例,並讓所有指針指向該實例,但是當我檢查指針指向的地址時,只有其中一個指向noItem實例的地址。將多個指針分配給同一個對象並檢查地址後,只有一個指針指向右邊的指針

我試着重新排列指針賦值的順序,它總是有相同的指針,它具有正確的指針,而不管何時使它指向noItem的實例,其餘指向接近實例地址的地址noItem,但從來沒有在那裏。我甚至嘗試爲每個項目類型創建一個noItem的實例,但同樣的問題發生了。

class parent1 { 

}; 

class parent2 { 

}; 

class child : public parent1, public parent2 { 

}; 


int _tmain(int argc, _TCHAR* argv []) 
{ 
parent1 *p1; 
parent2 *p2; 

child a; 

p1 = &a; 
p2 = &a; 

cout << &a << endl; 
cout << p1 << endl; 
cout << p2 << endl; 

system("pause"); 

} 

在本實施例P1指向&一個但P2點到另一個地址。如果我更改孩子從父類繼承的順序,則p2將指向& a,但p1將指向另一個地址。爲什麼會發生?

+5

能否請您發佈的代碼? – Stefan

+1

問題中有足夠的信息,你只需要閱讀英文。 – MSalters

回答

0

正如您所述,您的noItem類源自許多其他類型,例如, Helmet。這意味着在noItem對象的某個位置,有一個Helmet子對象。它可能在一開始,但只有一個子對象位於那裏(通常是第一個基類,忽略了複雜的繼承方案)。

看看你的指針。有一個你聲稱是「正確的」。這是指向第一個基類子對象。現在計算sizeof(*correctPointer)。這會告訴你第二個子對象可以在哪裏開始。可能會有一些填充,但總的來說,這將是神祕的差異。

0

向您的項目基類添加一個向量或指針列表。根據需要分配並將您的項目插入列表中。不要硬編碼一定數量的項目。缺乏一件物品最好是沒有任何東西。

1

你說你這樣做

class Helm {} 
class Legs {} 
class Sleeves {} 
class noItem : public Helm, public Legs, public Sleeves {} 

,而不是你應該做這樣的事情

class Item {} 
class Helm : public Item {} 
class Legs : public Item {} 
class Sleeves : public Item {} 
相關問題