Существует также Structure101, который должен сделать это.
Ваша проблема в том, что player выпадает из области видимости в каждом блоке if / else if.
Вам необходимо объявить свою переменную над всеми операторами if.
Но вы не можете использовать для этого ссылку, потому что вы должны сразу же инициализировать ссылку.
Вместо этого вы, вероятно, захотите что-то вроде этого:
int main(int argc, char *argv[]) {
Player * pPlayer = NULL;
if (argv[3] == string("simple")) {
pPlayer = get_Simple();
} else if (argv[3] == string("counting")) {
pPlayer = get_Counting();
} else if (argv[3] == string("competitor")) {
pPlayer = get_Competitor();
}
//Then if you really want to...
Player &player = *pPlayer;
}
Другие предлагали указатели. Однако можно также использовать условный оператор.
Player & player = argv[3] == string("simple") ? get_Simple()
: argv[3] == string("counting") ? get_Counting()
: get_Competitor();
Вы объявили три отдельные переменные player
в трех разных областях видимости, и сообщение об ошибке говорит именно то, что это означает.
Вам необходимо объявить одного игрока переменная вне if
-условия и присвоить результат. Это сложно, поскольку player является ссылкой - вы должны инициализировать его один раз.
Вы можете поместить if
-запись в функцию (скажем, GetPlayer ()
), которая возвращает указатель на объект, а затем инициализируйте проигрыватель с помощью * GetPlayer ().
В
if (argv[3] == string("simple")) {
Player & player = *get_Simple();
}
Переменная существует только между {}
. Когда вы дойдете до }
, переменная не использовалась и будет отброшена, так как никогда не использовалась.
Если вы поместите статическую переменную внутрь области видимости, разделенную {}
, то эта переменная больше не будет доступна, когда область действия закончится.
Попробуйте это вместо этого:
int main(int argc, char *argv[]) {
// TODO: validate argc and argv here
if (argc < 3) {
printf("error: not enough arguments\n");
exit(1);
}
Player* player_ptr = NULL;
if (argv[3] == string("simple")) {
player_ptr = get_Simple();
} else if (argv[3] == string("counting")) {
player_ptr = get_Counting();
} else if (argv[3] == string("competitor")) {
player_ptr = get_Competitor();
}
if (!player_ptr) {
printf("error: invalid argument %s\n", argv[3]);
exit(1);
}
Player& player = *player_ptr;
// More code
}
#include <map>
int main(int argc, char **argv)
{
typedef std::map<std::string, Player*(*)()> lookup;
lookup mapping;
mapping["simple"] = get_Simple;
mapping["counting"] = get_Counting;
mapping["competitor"] = get_Competitor;
lookup::const_iterator it = mapping.find(argv[3]);
if (it == mapping.end())
{
std::cout << "illegal argument\n";
}
else
{
Player& player = *it->second();
// more code
}
}