Возникли проблемы с конструкторами, которые принимают разные параметры - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в 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(){}

1 Ответ

0 голосов
/ 05 июля 2018

Здесь есть три проблемы. Во-первых, ваш конструктор объявлен как 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...