2015-11-03 3 views
1

Для проекта я делаю простую текстовую боевую игру на C++, с которой я не очень-то знаком.Доступ к строке дает пустое значение, даже если оно назначено

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

Код и рисунки ниже.

Game.cpp

#include "Game.h" 

Game::Game() 
{ 
    Player user = Player("Foo"); 
    gameLoop(); 
} 

void Game::gameLoop() 
{ 
    std::string name = user.getName(); 
    printf("name: %s", name.c_str()); 
} 

Game.h

#include <stdio.h> 
#include <string> 
#include "Player.h" 


class Game 
{ 
public: 
    Game(); 
private: 
    Player user; 

    void gameLoop(); 
}; 

Player.cpp

#include "Player.h" 

Player::Player(std::string name) 
{ 
    playerName = name; 

} 

std::string Player::getName() { 
    std::string nameWatch = playerName; 
    return playerName; 
} 

Player.h

#include <stdio.h> 
#include <stdlib.h> 
#include <string> 

class Player 
{ 
public: 
    Player(std::string name); 
    Player() {} 

    std::string getName(); 

private: 
    std::string playerName; 
}; 

[Name is set to playerName1

[Player name is now empty?2

ответ

3

В

Game::Game() 
{ 
    Player user = Player("Foo"); 
    gameLoop(); 
} 

Вы создаете локальную переменную user, скрывающую this->user.

Для инициализации переменной-члена, вы можете сделать

Game::Game() : user("Foo") 
{ 
    gameLoop(); 
} 

И если у вас есть несколько пользователей для инициализации:

Game::Game() : user("Foo"), comp("Monster") 
{ 
    gameLoop(); 
} 

Doing

Game::Game() 
{ 
    user = Player("Foo"); 
    comp = Player("Monster"); 
    gameLoop(); 
} 

создает по умолчанию user/comp и назначить после значения для них, поэтому для этого требуется, чтобы Player по умолчанию является конструктивным

+0

Здравствуйте, спасибо, что ответили так быстро - теперь я вижу, что я сделал неправильно. Теперь я понимаю, что я переписывал конструктор Player Player заголовка. Однако, если у меня было несколько игроков, ваше решение казалось немного сложнее. Теперь я использую это, и кажется, все в порядке. \t «код» пользователь = игрок («игрок»); comp = Player ("Monster"); 'code' – CrhonamO

+0

@ user1972995: Код окружения по обратной цитате, чтобы выделить их на SO. Отредактировано для обработки нескольких участников. – Jarod42

1
Game::Game() 
{ 
    Player user = Player("Foo"); 
    // you create local object with name user that override class-member object 
    // with same name. At least, you have user object like class member is empty cause 
    // constr initialization-list is empty, and compiler call default const for std::string class that 
    // exactly empty string, and local Player object with name user that die on close brace end. 

    // First of all, use "Hungarian notation" style to detect class-member variables, for example: 
    // 
    // class Hello 
    // { 
    // private: 
    // int m_user; 
    // } 


    // At second, if one of your class-members haven't default constr and you should explicit call correct 
    // constructor use "Constructor initialization-list, like 
    // 
    // Game::Game() : 
    // m_user("Mike") 
    // { 
    // 
    // } 

    gameLoop(); 
} 
Смежные вопросы