Я новичок в C++, и у меня проблемы с файлами классов и заголовков. Я пытаюсь создать конструктор, принимающий различные характеристики покемонов, такие как строки и целые числа. Раньше я кодировал на java, и назначать конструкторы было довольно просто.
Pokemons.h
#ifndef POKEMONS_H
#define POKEMONS_H
#include <string>
#include <iostream>
using namespace std;
class Pokemons {
public:
Pokemons();
};
#endif /* POKEMONS_H */
Pokemons.cpp
#include "Pokemons.h"
#include <string>
using namespace std;
string pokemonName;
string pokemonType1;
string pokemonType2;
int pokemonHP;
int pokemonAttack;
int pokemonDefence;
int pokemonSPAttack;
int pokemonSPDefence;
int pokemonSpeed;
Pokemons::Pokemons(string nm, string tp1, string tp2, int hp, int atk,
int def, int satk, int sdef, int spd) {
pokemonName = nm;
pokemonType1 = tp1;
pokemonType2 = tp2;
pokemonHP = hp;
pokemonAttack = atk;
pokemonDefence = def;
pokemonSPAttack = satk;
pokemonSPDefence = sdef;
pokemonSpeed = spd;
}
main.cpp
#include <iostream>
#include "Pokemons.h"
int main(){
Pokemons p001;
p001.Pokemons("Bulbasaur", "Grass", "None", 31,23,45,43,45,12);
return 0;
}
Я получаю следующие ошибки:
Pokemons.cpp:32:9: error: prototype for 'Pokemons::Pokemons(std::string, std::string, std::string, int, int, int, int, int, int)' does not match any in class 'Pokemons'
Pokemons::Pokemons(string nm, string tp1, string tp2, int hp, int atk, int def, int satk, int sdef, int spd) {
In file included from Pokemons.cpp:14:0:
Pokemons.h:21:7: error: candidates are: constexpr Pokemons::Pokemons(Pokemons&&)
class Pokemons {
Pokemons.h:21:7: error: constexpr Pokemons::Pokemons(const Pokemons&)
Pokemons.cpp:30:9: error: Pokemons::Pokemons()
Pokemons::Pokemons(){}
pokemonName ... pokemonSpeed должен быть в определении вашего класса вместо глобальных переменных в исходном файле.
Все объявления членов должны находиться внутри определения класса, а не за его пределами. (Он будет очень похож на соответствующую Java.)





Здесь есть три проблемы. Во-первых, ваш конструктор объявлен как Pokemons();, принимает нулевые аргументы, но у вас есть конструктор определенный, принимающий много аргументов, поэтому их сигнатуры не совпадают, и, в конечном итоге, из-за перегрузки функций в C++ они ссылаются на разные функции. Попробуйте объявить конструктор в заголовочном файле следующим образом:
class Pokemons {
public:
Pokemons(string nm, string tp1, string tp2, int hp, int atk,
int def, int satk, int sdef, int spd);
};
Теперь и определение, и объявление должны относиться к одной и той же функции.
Вторая проблема здесь:
Pokemons p001;
Это неявно вызывает конструктор без аргументов. Важно понимать, что многие функции вызываются в C++, даже если они не были названы явно. Чтобы исправить это, вы должны инициализировать p001 следующим образом:
Pokemons p001("Bulbasaur", "Grass", "None", 31,23,45,43,45,12);
Вам также следует удалить p001.Pokemons("Bulbasaur", "Grass", "None", 31,23,45,43,45,12); в следующей строке. Теперь компилятор может сопоставить этот вызов с вашим конструктором, принимая множество аргументов.
Третья проблема на данный момент заключается в том, что pokemonName на всем протяжении pokemonSpeed определены за пределами как класс Pokemons в глобальной области видимости. Это имеет тот же эффект, что и создание члена static в Java. Они должны быть помещены в определение вашего класса, чтобы сделать их членами экземпляра:
class Pokemons {
public:
Pokemons(string nm, string tp1, string tp2, int hp, int atk,
int def, int satk, int sdef, int spd);
private:
string pokemonName;
string pokemonType1;
string pokemonType2;
int pokemonHP;
int pokemonAttack;
int pokemonDefence;
int pokemonSPAttack;
int pokemonSPDefence;
int pokemonSpeed;
};
Спасибо за ответ, но теперь я получаю следующие ошибки: main.cpp: 20: 18: error: нет функции сопоставления для вызова Pokemons :: Pokemons () Pokemons p001; ^ ~~~ I Pokemons.h: 21: 7: примечание: кандидат ожидает 1 аргумент, 0 при условии Pokemons.h: 21: 7: примечание: кандидат: constexpr Pokemons :: Pokemons (Pokemons &&) Pokemons.h: 21: 7: примечание: кандидат ожидает 1 аргумент, 0 предоставлено main.cpp: 21: 14: ошибка: недопустимое использование p001.Pokemons 'Pokemons :: Pokemons' ("Bulbasaur", "Grass", "None", 31,23,45, 43,45,12);
Я чувствую себя немного глупо прямо сейчас. Спасибо, добрый сэр, что помогли мне !.
Без проблем. У C++ довольно крутая кривая обучения и запутанная история по сравнению с Java.
Несколько вещей для вас, чтобы погуглить: «в инициализации класса», «список инициализации». Не используйте тело конструктора, если вы не иметь.