Проблемы с моей первой программой CPP - заголовок и источник - PullRequest
1 голос
/ 30 октября 2011

Я провожу субботний вечер, не одетый на Хэллоуин, а скорее сидя, пытаясь выучить CPP: D

В любом случае, может кто-нибудь, пожалуйста, помогите мне. Ниже я включил свой исходный код, в основном, когда я пытаюсь скомпилировать эту форму в терминале, я получаю много ошибок, в основном утверждая, что переменные "name, ho и т.д." объявил, но я включил свой заголовочный файл, так что кто-то может побриться посмотреть на это и, возможно, сказать мне, что не хватает? Заранее большое спасибо, ребята!

#ifndef __TPLAYER__
#define __TPLAYER__ //prevent multiple #includes

TPlayer
{
    private:
        char name;
        int hp;
        int dmg;
        int wep;

    public:
        TPlayer(void);
        ~TPlayer(void);
        //Naming
        void SetName(char *_name);
        char GetName(void);
        //Health
        void SetHealth(int *_hp);
        int GetHealth(void);
        //Damage
        int SetDamage(int *_dmp)
        //Weapon
        void SetWeapon(int *_wep);
        int GetWeapon(void);
};

#endif /* TPlayer.h */

и вот мой исходный файл:

#include "TPlayer.h"

/////////////////
// Constructor
/////////////////
TPlayer::TPlayer(void)
{
    name = "";
    hp = 0;
    dmg = 0;
    wep = 0;
}
///////////////////
// Destructor
///////////////////
~TPlayer::TPlayer()
{
    delete name;
    delete hp;
    delete dmg;
    delete wep;
}


///////////////////
//     Naming
///////////////////
void SetName(char *_name)
{
    name = _name;
}
char GetName(void)
{
    return *name;
}

И так далее, но это говорит мне, что, например, имя и т. Д. Не были такими, как показано ниже:

TPlayer.h:4: error: function definition does not declare parameters
TPlayer.cpp:6: error: ‘TPlayer’ has not been declared
TPlayer.cpp:6: error: ISO C++ forbids declaration of ‘TPlayer’ with no type
TPlayer.cpp: In function ‘int TPlayer()’:
TPlayer.cpp:8: error: ‘name’ was not declared in this scope
TPlayer.cpp:9: error: ‘hp’ was not declared in this scope
TPlayer.cpp:10: error: ‘dmg’ was not declared in this scope
TPlayer.cpp:11: error: ‘wep’ was not declared in this scope
TPlayer.cpp: At global scope:
TPlayer.cpp:16: error: expected class-name before ‘::’ token
TPlayer.cpp: In function ‘void SetName(char*)’:
TPlayer.cpp:30: error: ‘name’ was not declared in this scope
TPlayer.cpp: In function ‘char GetName()’:

Ответы [ 2 ]

7 голосов
/ 30 октября 2011

Возможно, вы захотите взять хорошую книгу по C ++ , чтобы извлечь уроки, поскольку вещи, которые вы ошибаетесь, являются фундаментальными для языка.


Для объявлений классов требуетсяclass Ключевое слово, предшествующее имени класса:

class TPlayer 
{ 
private:
    // ...

Это нужно вам, потому что компилятор должен знать, говорите ли вы о class, struct, union или enum и т. Д. В противном случае вы получите множество ошибок, подобных полученным.


Ваши функции-члены также должны начинаться с префикса TPlayer::, как, например, с конструкторами и деструктором.Они необходимы для того, чтобы компилятор знал, что они являются частью класса TPlayer.

TPlayer::TPlayer()
{
}

TPlayer::~TPlayer()   
{ 
}

void TPlayer::SetName(char *_name) 
{ 
} 

char TPlayer::GetName(void) 
{ 
} 

Нет необходимости delete членов класса, которые вы не выделяли самостоятельно.

~TPlayer::TPlayer()       
{       
    // These are not needed. The variables name, hp, dmg, and wep
    // were allocated when you created an instance of TPlayer. These
    // will go away by themselves when the destructor is called.

    //delete name;       
    //delete hp;       
    //delete dmg;       
    //delete wep;

    // The exceptions to the above rule are things that are dynamically
    // allocated. For example, you must delete[] everything that
    // you new[]'ed, and you must fclose() all file handles you
    // get from fopen(). If you consistently use the RAII idiom,
    // then you won't have to worry about these "exceptions".
}

На самом деле современные программы на C ++ в настоящее время редко нуждаются в использовании delete в коде приложения.Идиома «Получение ресурсов - инициализация» (RAII) позволяет вам не беспокоиться о delete вещах в подавляющем большинстве случаев.Стандартные средства библиотеки, такие как std::vector, используют идиому RAII для управления памятью массива.


Обратите внимание, что существуют правила, касающиеся использования идентификаторов, начинающихся с подчеркиваний .Возможно, вам необходимо знать о них.


Для примера, приведем примерный класс:

foo.h

#ifndef FOO_H
#define FOO_H

class Foo
{
public:
    Foo();
    ~Foo();

    void Set(int n);
    int Get() const;

private: 
    int n;
};

#endif

foo.cpp

#include "foo.h"

Foo::Foo() : n(0)
{
}

Foo::~Foo()
{ 
}

void Foo::Set(int n)
{
    this->n = n;
}

int Foo::Get() const
{
    return n;
}
1 голос
/ 30 октября 2011

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

Кроме того, вашим определениям функций-членов должен предшествовать TPlayer::, то есть

TPlayer::SetName( const char* name ) {
    // ...
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...