#c #global-variables #scope
#c #глобальные переменные #область видимости
Вопрос:
Я работаю над большим проектом для игры, которая включает Javascript, Jquery, C и Awesomium. Прямо сейчас я сосредоточусь только на C для этого вопроса. В игре предполагается наличие двух разных «заданий» (вы можете быть либо ученым, либо мусорщиком). Мне нужно создать способ проверять, на какой работе вы в данный момент находитесь (вы можете изменить в игре). Я пытаюсь создать временный способ, поскольку я довольно новичок в C и уверен, что задача в конечном итоге будет кому-то передана.
Я не уверен относительно того, как сохранить эту «переменную» в памяти. Глобальные переменные в C , по-видимому, являются большим запретом. Я должен использовать статические … методы? Я просто не знаю. Сама программа слишком велика, чтобы включить какой-либо пример без большого редактирования и усилий. Если у вас есть какие-либо предложения или вопросы, я был бы рад услышать и попытаться ответить.
РЕДАКТИРОВАТЬ Мне нужна эта реализация заданий и переключений, прежде чем я смогу протестировать новую функциональность JS map. На самом деле это и есть причина для этого, поэтому, когда я создавал заголовок, это было у меня на уме.
Комментарии:
1. Вы можете использовать глобальные переменные, или вы можете сохранить переменную в функции main.
2. В названии вашего вопроса упоминается тестирование. Но в тексте вашего вопроса этого нет…
3. Похоже, что это значение будет сохранено как «Job» в классе «Player», который может быть в вашей игре singleton. Если бы ваш проект следовал лучшим практикам ООП, не похоже, что об этом даже был бы вопрос.
4. @walkingTarget Если бы я знал C лучше, это не было бы вопросом. Вы правы. Но я спрашиваю, потому что я -не-знаю.
Ответ №1:
Вы используете «объект». Фактически, это коллекции состояний и переменных, которые вы носите с собой.
enum Job {
Scientist,
Ditchman
};
class Player {
Job j;
public:
void job(Job newjob) { j = newjob; }
Job job() { return j; }
Player() { job = Scientist; }
};
int main() {
Player p;
p.job(Ditchman);
//....
p.job(Scientist);
}
В этом случае Player::j
переменная доступна для всех Player
функций, и, создавая экземпляр Player, мы также создаем экземпляр j
. Если другим функциям нужен доступ к нашей Player
, в этом случае мы обычно передаем по ссылке, поскольку не хотим создавать больше Player
функций.
Ответ №2:
Я бы рекомендовал использовать oo-подход, который использует базовый класс под названием job и производные классы под названием scientist и ditchman. Каждый производный объект из job будет храниться в каком-то массиве или контейнере и использовать полиморфные вызовы для выполнения правильных специализированных функций, которые должны иметь чисто виртуальное определение базового класса, а затем переопределяться в каждом производном классе.
Вы сказали, что «вы можете измениться в игре», превратившись из ученого в канавщика. Итак, если вы используете этот подход, то вам понадобится функция преобразования, которая выполняет всю работу, необходимую для преобразования между объектом scientist и объектом ditchman.
Вы никогда не должны использовать глобальные переменные. Также имейте в виду циклические ссылки (один класс вызывает метод в другом классе, а затем этот класс перезванивает в первый класс) и старайтесь этого тоже не делать. Нормально иметь какой-то контейнер, такой как вектор, карта или хэш-таблица, содержащий список объектов в игре и передающий указатель (или ссылку) на этот объект другим классам, которым это нужно.