2012-01-11 161 views
3

快速而愚蠢的问题。 如果我不允许使用全局变量,我该如何声明数组的大小?如何在C++中声明一个数组的固定大小

假设我有一个文件Album.h

class Album { 
private: 
    Song songs[MAX_SONGS]; 

    //... 

} 

我在哪里把MAX_SONGS = 30const int MAX_SONGS = 30 被认为是一个变量的权利? 请注意,整个程序的大小应该是已知的。

+2

'const int的MAX_SONGS = 30;'被认为是成为一个“常量”。你也可以使用'#define MAX_SONGS 30'预处理指令。 – Cyclonecode 2012-01-11 21:20:12

+1

是否有没有使用容器的原因? – Tony 2012-01-11 21:20:37

+2

使用'std :: vector ',你不必定义最大尺寸。 – 2012-01-11 21:21:24

回答

7
class Album { 
private: 
    static const int MAX_SONGS = 100; 
    Song songs[MAX_SONGS]; 

    //... 
}; 

请注意,静态常量变量的内联初始化只允许那些类型为整数的内联初始化。还要注意,不管初始化如何,这仍然只是一个声明而不是定义。你通常不需要定义,虽然在某些情况下你会这样做。

至于可见性,您可以提供一个静态获取函数,它将返回MAX_SONGS。

public: 
static int GetMaxSongs() { return MAX_SONGS; } 
+0

根据OP的要求,MAX_SONGS必须是“public”。 – hmjd 2012-01-11 21:22:56

+0

@hmjd:是吗? – 2012-01-11 21:23:18

+0

或者...指出它需要被应用程序使用。 – hmjd 2012-01-11 21:24:14

2

const int MAX_SONGS = 30被认为是一个变量吧?

是,MAX_SONGS是一个变量,但它是一个恒定可变。它不能改变。

这并不是全球变量不可取,而是全球可变状态是不可取的,如果可以避免的话。这里没有可变状态:MAX_SONGS不能改变。

+0

常量变量?... – 2012-01-11 21:22:21

+2

@PaulManta:是的。事实上,这是什么。 – 2012-01-11 21:22:33

+0

更重要的一点是'MAX_SONGS'是一个_constant表达式_。考虑一个替代的'extern const int MAX_SONGS;'在其他TU中有一个初始化器不会是一个_constant表达式_即使它是一个常量变量。 – 2012-01-11 21:22:47

0

您也可以使用#define预处理器命令。

在Album.h

#define MAX_SONGS 30 
在Album.cpp

#include "Album.h" 
class Album { 
private: 
    Song songs[MAX_SONGS]; 
//... 
} 
+0

#define是否在其他模块中可见? – Pincopallino 2012-01-12 16:52:19

+1

为此,他们必须包含Album.h。你也可以创建一个Contants.h文件并将其导入到Album.h以及任何需要的地方 – 2012-01-12 19:49:05

0

为了避免static用法,使用enum

class Album { 
    private: 
     enum { MAX_SONGS = 30 }; 
     Song songs[MAX_SONGS]; 

     //... 
    } 
相关问题