2015-09-11 54 views
-5

我運行在C++以下代碼:陣列對象的尺寸傳遞給函數

class Tile { 
    //class definition 
}; 

bool myFunction(Tile* Tiles) { 
    sizeof(Tiles); 
    sizeof(Tiles[0]); 
    //other code 
} 

int main() { 
    Tile tiles [16]; 
    //other stuff 
    myFunction(tiles); 
    return 0; 
} 

當我使用如上所描述的的sizeof方法,它只給我的指針的大小,而不是實際的目的。我正在嘗試查找對象的大小。我的問題是如何獲取給定指針的對象的大小?

+0

'我如何根據給定的指針獲取對象的大小?'您不知道。作爲附加參數傳遞大小。 –

+0

如果您知道它是一個數組,您可以使用模板來推斷大小,而無需明確傳遞它。例如,搜索一個用模板實現的'arraysize'函數。 – chris

+0

指針*是一個實際的對象。不要將指針與指向的東西混合在一起。 –

回答

-1

回答我的問題:

爲什麼我張貼這個答案

我是新來的C++的時候,和其他問題已被標記爲這個重複。因此,我猜這樣的其他問題來自C++新手。這個答案將是爲了那些新手的利益。

我的回答

不像高級語言如Python或Java中,數組的長度是不存儲與陣列的內容,所以沒有辦法來訪問它。

因此,它必須作爲單獨的參數傳遞。在高級語言中可能沒有多大意義,但在C和C++中都是必需的。

另外,與Python和JAVA不同,數組是而不是的一個對象。要充分理解C/C++數組,首先必須理解指針。

3

數組自然衰變爲指針,當它們這樣做時,所有大小的信息都會丟失。最常見的解決方案是將數組中元素的數量作爲參數傳遞。也可以使用模板來推斷數組的大小。

或者使用std::array(或std::vector,視情況)來代替,這是我推薦的解決方案。

2

最簡單的C-sytle方法是將數組大小作爲參數傳遞。

bool myFunction_ver1(Tile* Tiles, std::size_t size) 
{ 
    //... 
} 

但是C++提供了更多。由於數組大小包含在數組的數據類型中,所以模板可以提供幫助。該數組應該通過引用傳遞,以防止將數組調整爲指針。

template <std::size_t N> 
bool myFunction_ver2(const Tile (&Tiles)[N]) 
{ 
    // N is the array size 
} 

但我們應該更喜歡使用std::arraystd::vector而不是原始數組。

template <std::size_t N> 
bool myFunction_ver3(const std::array<Tile, N>& Tiles) 
{ 
    // You may use N or Tiles.size() 
} 

bool myFunction_ver4(const std::vector<Tile>& Tiles) 
{ 
    // use Tiles.size() 
} 
0

原始數組衰減爲指針作爲函數參數,因此與該類型關聯的任何長度信息都將被刪除而不使用模板。因此,使用原始數組可以將數組的大小作爲參數傳遞。

bool myFunction(std::size_t n, Tile tiles[n]) { 

    std::size_t z = n * sizeof(Tile); 

    // etc... 
} 

使用任std::vectorstd::array通常更好的解決方案雖然。