George2000C++ Ответов: 2

Ожидаемый uniqualified-id перед помощью токена '{'


#include <iostream>
#include <string>
struct Player {

	char name [50];
	char player_class [50];
	unsigned short int level;
	float exp;
	bool competitive;
};
struct Battle {

	char battle_name[50];
	char battle_favour_class[50];
	int min_level;
	int xp;
};
void show_player (Player);
{ //PROBLEM IS HERE
if (bool Player.competitive == 1){
	cout<<Player.name<<" is a competitive level "<<Player.level <<Player.player_class<<"\n";
else if (bool Player.competitive == 1)
	cout<<Player.name<<" is an amateur level "<<Player.level <<Player.player_class<<"\n";
}
}


Что я уже пробовал:

Ошибка кроется в коде, опубликованном выше.

2 Ответов

Рейтинг:
2

CPallini

Попробуй

#include <iostream>
#include <string>
using namespace std;

struct Player
{
  string name;
  string theClass; // since 'class' is reserved
  unsigned short int level;
  float exp;
  bool competitive;
};
struct Battle
{
  string name;
  string favour_class;
  int min_level;
  int xp;
};

void show_player (const Player & player)
{
  if (player.competitive)
    cout << player.name<< " is a competitive level "<< player.level << ", class " << player.theClass << "\n";
  else
    cout << player.name<< " is an amateur level "<< player.level << ", class " << player.theClass << "\n";
}


int main()
{
  Player p;
  p.name = "Foo";
  p.theClass = "Superior";
  p.level = 10;
  p.competitive = true;

  show_player(p);
}


George2000C++

Я хочу иметь имя[50] , theClass[50] , favor_class[50]

CPallini

Ты мог бы, но..... Почему?

Рейтинг:
14

k5054

Между объявлением функции и ее телом не должно быть точки с запятой. Этот

void show_player(Player);
это прототип, который сообщает компилятору, какова сигнатура функции. Чтобы определить нужную вам функцию
void show_player(Player aPlayer)
{
    if(aPlayer.competitive) {
        // ...
    } else {
       // ...
    }
}

Записи:
Нам нужно дать аргументу функции имя, как мы делаем, когда определяем переменную. Так например мы могли бы иметь int playerCompare ( Player Player1, Player Player2 ) который будет сравнивать игрока, возвращающего индикатор, если игрок 1 ранжирован ниже, равен или выше игрока 2. Не называя аргументы, мы не можем отличить Player1 от Player2.

bool иметь значение истинный и ложный. Нам не нужно, чтобы попытаться создать переменную типа bool для проверки. Иногда это действительно помогает сравнивать эксплицитность с истиной или ложью, но вы должны использовать эти значения, а не 1 или 0. Однако будьте осторожны при тестировании не-булов на истинностное значение. В C/C++ ноль-это "ложь", и какой-нибудь ненулевое значение-это "истина".

Если не указано иное, C++ передает все параметры по значению. Это означает, что создается копия значения, и функция использует эту копию для всех вычислений. Для небольших структур или классов (объектов) это не является большой проблемой, но когда вы добираетесь до больших объектов, вы несете наказание за создание копии для передачи функции. Гораздо лучше было бы ссылка напр.
void show_palyer(Player& aPlayer)
{
    // function body
}
. Обратите внимание на &усилитель; после типа параметра. Это говорит компилятору использовать ссылку на объект, а не делать копию. Еще лучше, если мы знаем, что мы не собираемся изменять объект, мы можем использовать const refercence например,
void show_player(const Player& aPlayer)
{
    // fuction body
}
Пометив ссылку как константа мы гарантируем, что мы не можем непреднамеренно изменить объект. Мы также сообщаем компилятору, что объект не будет изменен, поэтому он может выполнить дальнейшую оптимизацию, если это возможно.


CPallini

5.