2015-11-01 2 views
1

Здравствуйте, я работаю над домашней работой и из-за правил домашней работы, которым не разрешено использовать глобальные переменные. Я провел исследование глобальных переменных, но не мог понять, являются ли мои переменные глобальными или локальными. Переменные определены в конструкторе внутри моего класса. Это как мой заголовок выглядит следующим образом:Являются ли мои переменные глобальными?

#include <string> 
using namespace std; 

class Team{ 
    public: 
     string tColor; 
     string tName; 
}; 
class Player{ 
    public: 
     string pPos; 
     string pName; 
}; 
class SocReg { 
    private: 
     Team *teams;// These are the variables Im not sure of 
     Player *players;// These are the variables Im not sure of 
     int playernum, teamnum; // These are the variables Im not sure of 
    public: 
     SocReg(); 
     ~SocReg(); 
     void addTeam(string teamName, string color); 
     void removeTeam(string teamName); 
     void addPlayer(string teamName, string playerName, string playerPosition); 
     void removePlayer(string teamName, string playerName); 
     void displayAllTeams(); 
     void displayPlayer(string playerName); 
     void displayTeam(string teamName); 
// ... 
// you may define additional member functions and data members, 
// if necessary. 
}; 

Этот вопрос может показаться слишком noobish, но им так запутанные заранее спасибо

+3

Строки, которые вы прокомментировали, не определяют * variables *, но * частные члены экземпляра *, и они по определению являются неглобальными. –

+2

@ FrédéricHamidi: переменными-переменными являются переменные. –

+1

Зачем им быть глобальным o.O –

ответ

4
Team *teams;// These are the variables Im not sure of 
    Player *players;// These are the variables Im not sure of 
    int playernum, teamnum; // These are the variables Im not sure of 

прагматический ответ: Эти переменные не являются ни глобальной, ни локальной. Они являются переменными-членами. Но тот, кто дал вам это задание, просто хотел убедиться, что вы не используете глобальные переменные, так что с вами все будет в порядке. Было бы совершенно бессмысленно давать учащимся задание с class и запрещать переменные-члены.

Language-адвокат Ответ: Ни "глобальная переменная" "переменная-член" ни являются официальной терминологии. Верьте или нет, но весь ~ 1300-1400 PDF для стандарта ISO C++ содержит только 3 экземпляра «переменной-члена» и 1 экземпляр «глобальной переменной» (я искал в проекте PDF, но это не делает большая разница).

Локальные переменная описана в стандарте С ++ в §3.3.3/1 следующим образом:

Переменные, объявленные в блоке сфере является локальной переменной.

Глобальная переменная официально называется «нелокальной переменной» (§3.6.2).Это по определению противоположность локальной переменной.

переменная член официально называется «член данных», о чем свидетельствует в §9.2/1:

Членов класса являются членами данных, функция-членов (...), вложенные типов, и счетчики.

2

Глобальные переменные, которые вы можете увидеть и изменить из «где-нибудь» в коде, т.е. , вне какого-либо конкретного класса.

Они считаются вредными, потому что, когда вы меняете глобальную переменную, вам нужно как-то узнать весь код, который мог бы посмотреть на нее, чтобы узнать, какие последствия могут иметь изменения. Это очень затрудняет рассуждение о вашем коде.

Все ваши переменные инкапсулируются внутри объектов и НЕ являются глобальными. В C++ глобальные переменные объявляются вне классов или «статические».

+0

Настоящий юрист-юрист может меня исправить, но я бы не считал, что член класса 'static' является глобальным, поскольку он все еще имеет область видимости. – JorenHeit

+0

А, ну, это не ответ на «юридический язык». Если у вас есть статический член, не являющийся константным классом, то: Если он является общедоступным, то это глобальная переменная, потому что вы можете возиться с ним из любого места. Если он является конфиденциальным, то вы, вероятно, предоставляете методы, которые с ним связаны (в противном случае это не имеет смысла), тем самым вызывая те же проблемы, что и глобальная переменная. –

+0

Итак, вы считаете переменными в пространстве имен, отличном от глобального пространства имен, глобальным? Эта терминология поддерживается стандартом? – JorenHeit

0

Это все определения классов, не объявленные переменные.

Так что нет глобальных переменных.

Например:

// example.cpp 
int BAR;  
class foo { 
    int bar; 
}; 
foo FOO; 

void f() { 
    BAR = 0; // We can access global variable here 
} 

int main() { 
    foo FOO2; 
    BAR = -1; // We can access global variable here 
    return 0; 
} 

BAR и FOO глобальные переменные, они могут быть доступны по всему миру.

class foo { 
    int bar; 
}; 

- просто определение класса foo.

FOO2 внутри функции main() также НЕ является глобальной переменной, поскольку она находится внутри основной функции и к ней не могут быть доступны внешние функции.

Смежные вопросы