2012-01-11 2 views
3

Быстрый и глупый вопрос. Как объявить размер массива, если мне не разрешено использовать глобальные переменные?Как объявить фиксированный размер массива в C++

Предположим, у меня есть файл Album.h:

class Album { 
private: 
    Song songs[MAX_SONGS]; 

    //... 

} 

, где я положил MAX_SONGS = 30? const int MAX_SONGS = 30 считается переменной справа? Обратите внимание, что размер должен быть известен всей программе.

+2

'константный Int MAX_SONGS = 30;' считается быть «константой». Вы также можете использовать предпроцессорную директиву '#define MAX_SONGS 30'. – Cyclonecode

+1

Есть ли причина не использовать контейнер? – Tony

+2

Используйте 'std :: vector ' и вам не нужно определять максимальный размер. –

ответ

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

    //... 
}; 

Обратите внимание, что встроенная инициализация статических константных переменных допускается только для тех, чей тип является интегральным. Также обратите внимание, что независимо от инициализации это все еще просто объявление, а не определение. Обычно вам не требуется определение, хотя есть определенные случаи, когда вы это делаете.

Что касается видимости, вы можете предоставить функцию статического геттера, которая вернет MAX_SONGS.

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

'MAX_SONGS' должно быть' public', согласно требованию OP. – hmjd

+0

@hmjd: Должно ли это? –

+0

или что ... точка должна быть доступна для приложения. – hmjd

2

const int MAX_SONGS = 30 считается переменной правильно?

Да, MAX_SONGS является переменной, но это постоянная переменная. Он не может измениться.

Это не так, что глобальные переменные нецелесообразны, но глобальное изменяемое состояние нецелесообразно, если его можно избежать. Здесь нет изменчивого состояния: MAX_SONGS не может измениться.

+0

Постоянная переменная? ... –

+2

@PaulManta: Да. То есть, на самом деле, что это такое. –

+0

Более важным моментом является то, что 'MAX_SONGS' является выражением _constant_.Рассмотрим альтернативу 'extern const int MAX_SONGS;' с инициализатором в каком-то другом TU не будет _constant expression_, даже если это постоянная переменная. –

0

Вы также можете использовать команду препроцессора #define.

в Album.h

#define MAX_SONGS 30 

в Album.cpp

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

Является ли #define видимым в других модулях? – Pincopallino

+1

Для этого они должны включать Album.h. Вы также можете создать файл Contants.h и импортировать его в Album.h и где это необходимо –

0

Чтобы избежать static использования, использовать enum:

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

     //... 
    } 
Смежные вопросы