Нужно ли передавать их [логические результаты] в функции?
Часто, но не всегда, я предпочитаю передавать их по ссылке, и да, это может стать большой цепью через многие функции. вздох.
Но ваш вопрос: "Вам нужно , чтобы пройти их ...".
Ответ - нет.
Потому что
a) вы отметили это сообщение как C ++, а
b) ключевой особенностью C ++ является пользовательский класс.
Подумайте об объявлении каждой «авантюрной функции» вашей истории в рамках класса.
Каждая «приключенческая функция», в качестве атрибута класса, реализована с одним «скрытым» параметром - указателем this на экземпляр класса.
Итак ... если вы поместите все свои логические значения 'result' в качестве атрибутов данных класса, то при вызове любой "приключенческой функции" также будут "переданы" все атрибуты данных экземпляра класса (все ваши bools!) как часть вызова. На самом деле никакие данные не перемещаются, только указатель, указатель 'this'.
Это может выглядеть примерно так:
#include <iostream>
using std::cout, std::cerr, std::flush, std::endl;
// using std::cin;
#include <iomanip>
using std::setw, std::setfill;
#include <sstream>
using std::stringstream;
#include <string>
using std::string;
namespace AS // Adventure Story
{
class CreateYourOwnAdventureStory_t
{
private:
// diagnostic purposes
stringstream ssUI;
// command line arguments concatenated into one string
// contents: strings convertable to ints to mimic cin
bool INTIM;
// other results go here
public:
int operator()(int argc, char* argv[]) {return exec(argc, argv);}
private:
int exec(int argc, char* argv[])
{
int retVal = 0;
// capture all command line arguments into a string
for (int i=1; i<argc; ++i)
ssUI << argv[i] << " ";
cout << "\n ssUI: " << ssUI.str() << "\n\n\n";
A1();
cout << "\n INTIM : " << INTIM << endl;
// ?more here?
return retVal;
}
void A1()
{
int choice = 0;
cout << "Well, Mr Artanon, ...\n "
"\n 1. ’It’s you who’ll get a rare cut across that corpulent neck of yours "
"if you don’t speed things along, you feckless blob of festering lard. "
"\n 2. ’Surely in such an industrious kitchen, there must be a starter or two "
"ready to send along and sate His Abhorentness’s appetite?’"
"\n (enter a menu option): ";
ssUI >> choice; // cin >> choice;
if (choice == 1) { A100(); }
if (choice == 2) { A167(); }
}
void A100()
{
int choice = 0;
INTIM = true;
ssUI >> choice; // cin >> choice;
cout << "\n\n A100() choice:" << choice
<< " INTIM: " << INTIM << endl;
}
void A167()
{
int choice = 0;
INTIM = false;
ssUI >> choice; // cin >> choice;
cout << "\n\n A167() choice:" << choice
<< " INTIM: " << INTIM << endl;
}
// other action-functions go here
}; // class CreateYourOwnAdventureStory_t
typedef CreateYourOwnAdventureStory_t CreateYOAS_t;
} // namespace AS
int main(int argc, char* argv[]){return AS::CreateYOAS_t()(argc,argv);}
Примечания:
Этот пример захватывает параметры командной строки и добавляет их в поток строк. Результат пригоден для использования так же, как ваши заявления Cin.
Вы заметили, что вам (вероятно) не понадобятся предварительные объявления для ваших функций? Компилятор должен сканировать большую часть объявления класса, чтобы решить различные проблемы, и, таким образом, может выяснить, что A100 (и A167) фактически находятся в области действия AS :: CreateYOAS_t ::. Функции по-прежнему можно перемещать в файл cpp, так что вы можете использовать преимущества отдельной компиляции. (и, возможно, сэкономите некоторые усилия при компиляции небольших файлов и только измененных файлов.)
Заметили ли вы, что функции, обращающиеся к INTIM, просто используют bool, не требуя каких-либо 'this->' для удаления ссылки?
Main вызывает простой Functor. Ничего больше. Основной вызывает оператор (). Простой, минимальный. Ctor и Dtor в настоящее время по умолчанию. Если вам нужно использовать ctor для инициализации результатов или другой промежуточной информации, я бы просто добавил его рядом с реализацией operator ().
PS: Вы упомянули использование bools для возврата результатов. В качестве альтернативы вы можете использовать строковый поток ... один поток с текстом ... использовать его в качестве журнала для записи текущей игры или для простого простого общего отчета пользователю.
Удачи.