BerthaDusStuf Ответов: 2

Почему я постоянно получаю ошибку "несколько определений роботов::роботы()"


Я постоянно получаю ошибку "несколько определений роботов::robots ()", говоря, что она сначала определена в строке 8. Я не могу определить проблему. Может ли кто-нибудь увидеть, что не так?

Вот это самое main.cpp файл:

#include <iostream>
#include "enemy_definitions.h"

using namespace std;

int main()
{
robots Bertha;
Bertha.print_information();
}


Вот файл enemy_definitions.h:
using namespace std;

class enemies
{
    public:
        string name;
        int hp;
        int damage;
        virtual void print_information();
}

class robots: public enemies
{
    robots();
    public:
        void print_information();
    private:
        int power_requirement;

};

class zombies: public enemies
{
    public:
        void print_information();
    private:
        int height;

};

class aliens: public enemies
{
    public:
        void print_information();
    private:
        string colour;

};


а вот это самое enemy_definitions.cpp файл:

#include "enemy_definitions.h"

void enemies :: print_information()
{
}

robots :: robots()
    {
        cout <<"Name: ";
        cin >> name;
        cout <<"\nhp: ";
        cin >> hp;
        cout <<"\ndamage: ";
        cin >> damage;
        cout <<"\n power_requirement: ";
        cin >> power_requirement;
    }

void robots :: print_information()
{
    cout << this->name << "has ";
    cout << this->hp << "hit-points. ";
    cout << this->damage << " damage and ";
    cout << this->power_requirement << "power requirement";
}

void zombies :: print_information()
{
    cout << this-> name <<"has";
    cout << this->hp << "hit-points. ";
    cout << this->damage << " damage and ";
    cout << this->height << "height";
}

void aliens :: print_information()
{
    cout << this->name << " has ";
    cout << this->hp << "hit-points, ";
    cout << this->damage <<" damage and ";
    cout << this->colour << "colour";


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

вещи..................................................

Richard MacCutchan

Где находится реализация проекта robots класс?

BerthaDusStuf

Определение класса находится в файле enemy_definitions.h под определением класса enemies, а затем реализация его конструктора и функции print_information() находится в файле enemy_definitions. h. enemy_definitions.cpp файл

Richard MacCutchan

Я только что построил этот проект и после исправления нескольких пунктов все это компилируется, связывается и запускается. После запятой отсутствует точка с запятой. enemies определение класса. И robots конструктор требует public: модификатор перед ним.

Richard MacCutchan

Мы не можем догадаться, где появляются сообщения об ошибках. Пожалуйста, покажите весь код, связанный с классом роботов, и укажите, откуда приходит сообщение об ошибке.

BerthaDusStuf

вот и весь код, и я сказал, что ошибка находится в строке 8 из enemy_definitions.cpp

2 Ответов

Рейтинг:
13

Jochen Arndt

Полное сообщение об ошибке содержит дополнительную информацию: имя исходного файла и номер строки. Проверьте эту строку и предшествующие строки или покажите нам полное сообщение и укажите строку в опубликованном коде.

Однако опубликованные фрагменты кода должны привести к ошибке в системе. aliens класс:

class aliens: public enemies
{
    public;
        void print_information();
    private:
        string colour;
};
После запятой вместо двоеточия стоит точка с запятой. public ключевое слово.


CPallini

5. Хороший улов.

BerthaDusStuf

Спасибо за точку с запятой и единственную другую информацию, которую она дает, - это номер строки 16, а файл enemy_definitions.h

Jochen Arndt

Из - за ошибки невозможно увидеть оригинальную (изначально опубликованную) версию.

Но я почти уверен, что robots::print_information() был там публичным, в то время как теперь он объявлен частным.

Посмотрите аналогичный фрагмент кода из моего ответа (который я скопировал и вставил) и сравните его с вашей текущей версией вопроса:
class aliens: public enemies
{
private:
string colour;
void print_information();
};

Эта функция является частной там, а также в классе роботов. А частные функции могут вызываться только самим классом, а не производными классами или экземплярами.

Эта функция должна быть публичной.

BerthaDusStuf

Но это класс, который вызывает print_information. Я создал класс под названием Bertha и вызвал print_information для самого класса, так что частная функция не должна быть проблемой

Jochen Arndt

Нет. Вы вызываете его из экземпляра класса. Частные функции могут быть вызваны только из функций, которые сами являются членами класса. Вот в чем причина существования частных членов:
Чтобы запретить доступ к ним из экземпляров класса.

Кроме того, Пожалуйста, не редактируйте свой вопрос так, как вы это сделали. Мой ответ теперь больше не связан с текущей версией (несколько определений), в то время как речь шла о попытке вызвать частную функцию.

Если вопрос был решен, вы можете принять его. Если у вас есть новый вопрос, поднимите его.

BerthaDusStuf

Хорошо, я изменил его на public, но он все еще дает мне несколько объявлений robots::robots error

BerthaDusStuf

Хорошо извините за это и хорошо спасибо я попробую изменить его на публичный

BerthaDusStuf

все в порядке моя проблема решена

Рейтинг:
1

CPallini

Я хотел сделать это таким образом:

#include <iostream>
using namespace std;

class enemy
{
public:
  virtual void print_information()
  {
    cout << "name " << name << ", hp " << hp << ", damage " << damage;
  }
private:
  string name{};
  int hp{};
  int damage{};
};

class robot: public enemy
{
public:
  virtual void print_information () override
  {
    enemy::print_information();
    cout << ", power_requirement " << power_requirement;
  }
private:
  int power_requirement{};
};



int main()
{
  robot bertha;
  bertha.print_information(); cout << endl;
}


BerthaDusStuf

Я не знаю, что делает переопределение, а также вы использовали эти скобки {} после объявления переменных. Я не видел этого раньше, но я видел эти скобки () после переменных, чтобы поместить что-то в их конструктор.

CPallini

https://en.cppreference.com/w/cpp/language/override
https://en.cppreference.com/w/cpp/language/value_initialization

BerthaDusStuf

Я думаю, что он предназначен для работы без использования переопределения или инициализации значения, потому что ни одна из этих вещей не была преподана в книге, которую я читаю. Есть ли просто ошибка, которую я могу исправить, чтобы заставить ее работать?

CPallini

Хотя на самом деле вы можете избежать использования как переопределения, так и единообразной инициализации, тот факт, что "они не преподаются в книге", не является веской причиной. Напротив, считайте, что ваша книга устарела.

BerthaDusStuf

хорошо, спасибо, что я нашел решение своей проблемы, и это было потому, что я никогда на самом деле не определял функцию print_information в суперклассе enemies, но теперь у меня есть еще одна проблема, так что я собираюсь обновить свой вопрос

BerthaDusStuf

Кроме того, когда вы делаете enemy::print_information (), во-первых, это просто вставить код из enemy print_information? Во-вторых, если он просто вставляет код, то он будет вставлять код, который будет пытаться получить доступ к частным членам врага, которые не были унаследованы роботом, потому что робот получает только открытые члены врагов, так почему же этот код работает?

BerthaDusStuf

Все в порядке моя проблема решена