Я думаю, что все очень хорошо ответили на этот вопрос, поэтому я просто собираюсь рассказать вам о своей философии C ++ в отношении больших проектов, потому что кажется, что это информация, которую вы можете найти полезной.
ВСЕГДА отдельные объявления функций и их реализация.
Это значительно облегчит вашу жизнь. Объявите прототипы функций в файле .h, затем запишите реализацию в файле .cpp.
Например:
// mystuff.h
#ifndef MYSTUFF_H
#define MYSTUFF_H
int myFunction(int value, char letter);
#endif
И в моем .cpp файле:
// mystuff.cpp
#include "mystuff.h"
int myFunction(int value, char letter) {
// insert implementation here
}
Зачем это? Хорошо, одна веская причина в том, что когда ваш код не работает (как это, якобы, будет неизбежной реальностью для любого программиста), вы можете заменить ваш файл .cpp альтернативными реализациями, не изменяя структуру вашего кода. Мало того, вы обнаружите различные уловки, которые будут опираться на разделение деклараций и реализации, которые значительно облегчат вашу жизнь. Итог, сделай это.
Попытка инкапсуляции везде, где это возможно.
Если вы делаете большой проект (и вы заметите, что это верно для большинства крупных проектов, с которыми вы сталкиваетесь), инкапсуляция похожих функций, переменных и тому подобного сэкономит вам значительное время и энергию. Похоже, что вы создаете программу для игры - вы думали о том, чтобы заключить каждого игрока в класс Player или Human, со специфическими для каждого класса функциями? Если вы являетесь наркоманом C ++ или Java, как я, вы обнаружите, что объектно-ориентированный подход является наиболее эффективным подходом в 99 случаях из 100 (в 1% случаев обычно используются вспомогательные функции, которые на самом деле не подходят в любом из объектов, которые вы определили).
Кроме того, инкапсуляция позволяет вам воспользоваться двумя другими фундаментальными принципами объектно-ориентированного проектирования - полиморфизмом и наследованием. Например, вы можете определить класс Player, а затем, если ваша игра включает в себя компьютерного игрока и игрока-человека, вы можете написать отдельный класс для каждого из них, который наследует основные функциональные возможности Player, но реализует каждую функцию Player в другим способом (т. е. если есть функция makeMove, у человека будет другая реализация, чем у компьютера. Таким образом, наследование значительно упрощает вашу работу). Очевидно, что ОО-дизайн обладает многими качествами, которые привлекательны, но из того, что я почерпнул из вашего кода, я бы сказал, что вы извлекли бы наибольшую пользу из этих.
Очевидно, это моя собственная философия, а не та, которую я хотел бы принудительно навязать вам. Но, надеюсь, вы воспользуетесь несколькими полезными советами из моего краткого бреда, чтобы улучшить способ написания кода и / или избежать длинных списков ошибок. Желаем удачи!