Руководство с заголовком и основным шаблоном - ищите лучшие практики, пожалуйста - PullRequest
2 голосов
/ 30 сентября 2011

Я новичок в C ++ и нуждаюсь в некоторой помощи с точки зрения использования лучших практик кодирования.По сути, я создал свой заголовочный файл (character.h) со следующими данными:

using namespace std;

class character
{
    //available to all
    public:
        character();
        ~character(){};

        int getHP(){return hp;};
        int damage(int _damage);
        int levelUp(int _xp);

        void setHP(int _hp){hp = _hp;};
        string getName(){return name;};

    protected:
        int hp;
        string name;
};

class player:public character
{
    public:
        player();
        ~player(){};
    protected:
        string name;
        int lvl;
        int xp;
};

class enemy:public character
{
    public:
        enemy(string _name, int _hp);
        ~enemy(){};
    protected:
        string name;
        int lvl;
        int xp;
};

Я пытался сгенерировать основной файл (main.cpp) из этих данных

#include "character.h"
player::player()
{
    cout << "\t\t\nPlease enter your name: \n\t\t";
    cin >> name;
};

int main()
{
    //some code
    return 0;
}

Но я продолжаю получать ошибки

"undefined reference to `character::character()"

Может ли кто-нибудь помочь мне, почему я получаю эту ошибку, а также является ли этот подход наилучшей практикой для макета этого дизайна?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Что вам нужно сделать, это создать определение для ваших конструкторов по умолчанию character::character() и player::player().Хотя конструкторы по умолчанию не принимают аргументов, вам все равно нужно предоставить определение для них.Если они абсолютно ничего не делают, даже не инициализируют член, то вы можете просто сделать то, что вы сделали для своих деструкторов: character() { } и player() { }.

Однако вы можете (и, вероятно, должны) инициализироватьчлены данных в конструкторах, используя синтаксис списка инициализатора.Например, для класса символов это будет:

character() : hp(100), name("Mario") { }

Обратите внимание, что вам не нужна точка с запятой после }.Или вы можете НЕ использовать списки инициализаторов и иметь:

character() {
    hp = 100;
    name = "Mario";
}
0 голосов
/ 30 сентября 2011

Вам необходимо определить конструктор (и) для символа в вашем кодовом файле:

character::character():
  hp(10),
  name("default")
{
}
character::character (std::string name): hp(10) [...]
character::character (int hp): name("Default") [...]
character::character (std::string name, int hp) [...]

Это гарантирует, что все ваши переменные экземпляра определены.

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

В дополнение к этому вы должны использовать соглашение для именования переменных вашего класса / экземпляра: myName, _name или name_ являются обычными.Использование cppcheck может сэкономить вам время и нервы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...