Member 13680438 Ответов: 2

Как я могу исправить ошибки из кода, который я доказал


Я написал программу, которая должна была получить результат
10
00
10

ничего не меняя в основной функции, но я получил много ошибок, помогите, пожалуйста

ошибка:

C:\Users\Silas\Desktop\rsp2.cpp:37: error: expected `;' before '(' token
C:\Users\Silas\Desktop\rsp2.cpp:44: error: expected `;' before "bool"
C:\Users\Silas\Desktop\rsp2.cpp:44: error: expected `;' before '(' token
C:\Users\Silas\Desktop\rsp2.cpp:50: error: expected `;' before '}' token

C:\Users\Silas\Desktop\rsp2.cpp:51: error: no `void Scissors::setStrength(int)' member function declared in class `Scissors'
C:\Users\Silas\Desktop\rsp2.cpp:67: error: expected `;' before '(' token
C:\Users\Silas\Desktop\rsp2.cpp:72: error: expected `;' before '}' token
C:\Users\Silas\Desktop\rsp2.cpp: In member function `bool Paper::fight(Scissors)':
C:\Users\Silas\Desktop\rsp2.cpp:15: error: `int Tool::strength' is protected
C:\Users\Silas\Desktop\rsp2.cpp:64: error: within this context
C:\Users\Silas\Desktop\rsp2.cpp: At global scope:
C:\Users\Silas\Desktop\rsp2.cpp:73: error: no `void Paper::setStrength(int)' member function declared in class `Paper'
C:\Users\Silas\Desktop\rsp2.cpp: In member function `bool Rock::fight(Paper)':
C:\Users\Silas\Desktop\rsp2.cpp:15: error: `int Tool::strength' is protected
C:\Users\Silas\Desktop\rsp2.cpp:87: error: within this context
C:\Users\Silas\Desktop\rsp2.cpp: In member function `bool Rock::fight(Scissors)':

C:\Users\Silas\Desktop\rsp2.cpp:15: error: `int Tool::strength' is protected
C:\Users\Silas\Desktop\rsp2.cpp:94: error: within this context
C:\Users\Silas\Desktop\rsp2.cpp: At global scope:
C:\Users\Silas\Desktop\rsp2.cpp:97: error: no `void Rock::setStrength(int)' member function declared in class `Rock'
C:\Users\Silas\Desktop\rsp2.cpp: In function `int main()':
C:\Users\Silas\Desktop\rsp2.cpp:105: error: no matching function for call to `Scissors::Scissors(int)'
C:\Users\Silas\Desktop\rsp2.cpp:35: note: candidates are: Scissors::Scissors()
C:\Users\Silas\Desktop\rsp2.cpp:35: note:                 Scissors::Scissors(const Scissors&)
C:\Users\Silas\Desktop\rsp2.cpp:106: error: no matching function for call to `Paper::Paper(int)'
C:\Users\Silas\Desktop\rsp2.cpp:59: note: candidates are: Paper::Paper()
C:\Users\Silas\Desktop\rsp2.cpp:59: note:                 Paper::Paper(const Paper&)
C:\Users\Silas\Desktop\rsp2.cpp:107: error: no matching function for call to `Rock::Rock(int)'
C:\Users\Silas\Desktop\rsp2.cpp:81: note: candidates are: Rock::Rock()
C:\Users\Silas\Desktop\rsp2.cpp:81: note:                 Rock::Rock(const Rock&)
C:\Users\Silas\Desktop\rsp2.cpp:108: error: 'class Scissors' has no member named 'fight'
C:\Users\Silas\Desktop\rsp2.cpp:108: error: 'class Paper' has no member named 'fight'
C:\Users\Silas\Desktop\rsp2.cpp:109: error: 'class Paper' has no member named 'fight'
C:\Users\Silas\Desktop\rsp2.cpp:109: error: 'class Rock' has no member named 'fight'
C:\Users\Silas\Desktop\rsp2.cpp:110: error: 'class Rock' has no member named 'fight'
C:\Users\Silas\Desktop\rsp2.cpp:110: error: 'class Scissors' has no member named 'fight'

Execution terminated


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

#include <iostream>

using namespace std;

class Tool
{
protected:
   int strength;
   char type;

public:
   int result;
   void setStrength (int)
   {
      strength = 0;
      type = ' ';
   }

   int getStrength() { return strength; }
   char getType() {return type; }
};

//SCISSOR CLASS*******************************************

class Scissors: public Tool
{
public:
   bool fight(Paper) {
      Paper p1;
      Scissors s1;
      return p1.strength < s1.strength;
   }

   bool fight(Rock) {
      Scissors s1;
      Rock r1;
      return r1.strength < s1.strength;
   }
};
  
void Scissors::setStrength (int x) {
   strength = x;
   type = 's';
}

//PAPER CLASS*********************************************

class Paper : public Tool
{
public:
   bool fight(Scissors) {
      Paper p1;
      Scissors s1;
      return p1.strength < s1.strength;
   }

   bool fight(Rock) {
      Paper p1;
      Rock r1;
      return r1.strength < p1.strength;
   }
};

void Paper::setStrength (int x) {
   strength = x;
   type = 'p';
}

//ROCK CLASS***********************************************

class Rock : public Tool
{
public:
   bool fight(Paper) {
      Paper p1;
      Rock r1;
      return p1.strength < r1.strength;
   }

   bool fight(Scissors) {
      Rock r1;
      Scissors s1;
      return r1.strength < s1.strength;
   }
};

void Rock::setStrength (int x) {
   strength = x;
   type = 'r';
}

//MAIN FUNCTION********************************************

int main() {
   Scissors s1(5);
   Paper p1(7);
   Rock r1(15);
   cout << s1.fight(p1) << p1.fight(s1) << endl;
   cout << p1.fight(r1) << r1.fight(p1) << endl;
   cout << r1.fight(s1) << s1.fight(r1) << endl;
   return 0;
}

2 Ответов

Рейтинг:
1

CPallini

Следующий код исправляет ошибки компиляции. Однако это не исправляет

  • (Возможные) логические ошибки (я даже не знаю деталей игры).
  • Беднота OOP подход: например, ваши производные классы действительно получают незначительное преимущество от наследования.
#include <iostream>

using namespace std;

class Tool
{
protected:
   int strength;
   char type;

public:
   int result;
   void setStrength (int s = 0)
   {
      strength = s;
      type = ' ';
   }

   int getStrength() { return strength; }
   char getType() {return type; }
};

//SCISSOR CLASS*******************************************

class Paper;
class Rock;

class Scissors: public Tool
{
public:
  //Scissors(int s):strength(s){}
  Scissors(int s){ strength = s;}
  bool fight(Paper & p);
  bool fight(Rock & r);
  void setStrength(int x);
};

void Scissors::setStrength (int x)
{
   strength = x;
   type = 's';
}

//PAPER CLASS*********************************************

class Paper : public Tool
{
public:
  Paper(int s){strength = s;}
  bool fight(Scissors & s);
  bool fight(Rock & r);
  void setStrength(int x);
};

void Paper::setStrength (int x) {
   strength = x;
   type = 'p';
}

//ROCK CLASS***********************************************

class Rock : public Tool
{
public:
  Rock(int s){strength = s;}
  bool fight(Paper & p);
  bool fight(Scissors & s);
  void setStrength(int x);
};

void Rock::setStrength (int x)
{
   strength = x;
   type = 'r';
}

bool Scissors::fight(Paper & p)
{
  return p.getStrength() < strength;
}
bool Scissors::fight(Rock & r)
{
  return strength < r.getStrength();
}
bool Paper::fight(Scissors & s)
{
  return strength < s.getStrength();
}
bool Paper::fight(Rock & r)
{
  return r.getStrength() < strength;
}
bool Rock::fight(Paper & p)
{
  return strength < p.getStrength();
}
bool Rock::fight(Scissors & s)
{
  return strength < s.getStrength();
}
//MAIN FUNCTION********************************************

int main() {
   Scissors s1(5);
   Paper p1(7);
   Rock r1(15);
   cout << s1.fight(p1) << p1.fight(s1) << endl;
   cout << p1.fight(r1) << r1.fight(p1) << endl;
   cout << r1.fight(s1) << s1.fight(r1) << endl;
   return 0;
}


Рейтинг:
0

phil.o

Вот несколько проблем, которые я мог бы заметить:

- метод борьбы (во всех трех подклассах) : вы объявляете только тип аргумента (Paper, Rock и т.д.), Но вы не предоставляете никаких имен своим параметрам; таким образом, вы не можете использовать их в методе. Кроме того, в этих методах вы создаете новые неинициализированные экземпляры объектов внутри метода, тогда как вместо этого вы должны использовать текущий экземпляр и параметр.
Например:

bool fight(Paper) {
   Paper p1;
   Scissors s1;
   return p1.strength < s1.strength;
}

предпочитаю быть
bool Fight(Paper p1) {
   return p1.strength < strength;
}

.. и так далее для других случаев Fight метод.

- getType метод: вы можете просто назначить type переменная его значение в конструкторах подклассов; нет никаких оснований сбрасывать это значение в конструкторах подклассов. setStrength метод, ответственность которого не состоит в том, чтобы иметь дело с type переменная.
Например:
class Tool {
   // ...
protected:
   Tool(const char t) : type(t) { }
};

class Scissors : public Tool {
public:
   Scissors() : Tool('s') { }
};

// ... and so on


- в самом деле main метод, вы используете конструкторы, объявления/определения которых вы не показывали.

Я не буду исправлять ваши ошибки. весь код, однако, по нескольким причинам:
- вы узнаете гораздо больше, определяя, понимая и решая проблемы самостоятельно, а не кто-то делает это за вас.
- эта задача совершенно выходит за рамки того времени, которое я готов/могу позволить себе потратить на пост быстрого ответа.

Но я надеюсь, что эти несколько строк направят вас на правильный путь.
Любезно.