Нужны идеи о том, как что-то хранить на C

#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.

Вы никогда не должны использовать глобальные переменные. Также имейте в виду циклические ссылки (один класс вызывает метод в другом классе, а затем этот класс перезванивает в первый класс) и старайтесь этого тоже не делать. Нормально иметь какой-то контейнер, такой как вектор, карта или хэш-таблица, содержащий список объектов в игре и передающий указатель (или ссылку) на этот объект другим классам, которым это нужно.