Переменные не дают правильных данных - PullRequest
0 голосов
/ 24 августа 2011

Мои переменные не производят данные, как они должны быть.По какой-то причине моя строка пуста, но когда я пытаюсь выполнить свою функцию, мой персонаж явно передает аргумент «holland» параметру name при создании.Несмотря на это, когда я вызываю get_name (), строка возвращается как пустая.Кроме того, у меня есть статическое целое число с именем «character_count», которое должно инициализироваться в 0, а затем увеличиваться при каждом создании персонажа для передачи значений в уникальный идентификатор персонажа.Несмотря на это, он все еще не работает должным образом.

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

вот мой источник:

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


int Character::char_count = 0;

Character::Character()
{
    this->char_id = char_count;
    char_count++;
}

Character::Character(std::string char_name, Race char_race, Gender char_gender)
{
    char_id = char_count;
    char_count++;
    name = char_name;
    race = char_race;
    gender = char_gender;
}

Character::~Character()
{

}

std::string Character::get_name()
{
    return this->name;
}

int Character::get_id()
{
    return this->char_id;
}

Race Character::get_race()
{
    return this->race;
}

Gender Character::get_gender()
{
    return this->gender;
}

Вот мойзаголовочный файл:

#include <iostream>
#ifndef CHARACTER_H
#define CHARACTER_H

enum Race {HUMAN, DARK_ELF};
enum Gender {MALE, FEMALE};
class Character
{
public:
    Character();
    Character(std::string& char_name, Race& char_race, Gender& char_gender);
    ~Character();

    int get_id();
    std::string get_name();
    Race get_race();
    Gender get_gender();

private:
    int char_id;
    static int char_count;
    std::string name;
    Race race;
    Gender gender;
};

#endif // CHARACTER_H

Вот мой основной:

#include <QtCore/QCoreApplication>
#include <tinyxml/tinyxml.h>
#include "classowner.h"
#include "character.h"

int main(int argc, char *argv[])
{
    std::string holland_name = "holland";

    Character * holland = new Character(holland_name, HUMAN, MALE);
    delete holland;
    std::cout << "testing, mic...1, 2, 3...testing, testing. Bow, chica wow wowww!!1" << std::endl;
    std::cout << holland->get_id() << std::endl; //outputs as an 8 digit letter, when it should be either 0, or 1.
    std::cout << holland->get_name() << std::endl; //does not output at all.

    return 0;
}

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

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

Character * holland = new Character(holland_name, HUMAN, MALE);
std::cout << "testing, mic...1, 2, 3...testing, testing. Bow, chica wow wowww!!1" << std::endl;
std::cout << holland->get_id() << std::endl;
std::cout << holland->get_name() << std::endl;
delete holland;

Удалить только после того, как вы закончите с соответствующим объектом.Такая ошибка вызывает неопределенное поведение, что означает, что все ставки отключены, и что-то может произойти, когда вы запустите свой код.В некотором смысле вам повезло, что произошла очевидная ошибка.Возможно, ваша программа работала успешно, и вы никогда бы не узнали, что есть проблема.

1 голос
/ 24 августа 2011

Ваш код фактически вызывает неопределенное поведение.Поскольку вы удалили указатель:

 delete holland;

И после этой строки вы используете его снова.Неопределенное поведение!

Теперь, если его неопределенное поведение, то выход не может быть объяснен после этого!

1 голос
/ 24 августа 2011

Вы удалили объект, а затем попытались получить к нему доступ.Это неопределенное поведение ™, и может произойти все, что угодно, в том числе ваш писатель-компилятор, который бьет вас по голове бейсбольной битой.Вы должны просто сделать

Character holland(holland_name, HUMAN, MALE);
std::cout << holland.get_id();

Как правило, если вы действительно, действительно не знаете, что делаете, никогда не используйте new и delete - всегда используйте класс, который написан явноуправлять памятью или просто выделить объект в стеке.

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