2016-11-14 6 views
0

В моем классе utils у меня есть личная строка dir для решения - она ​​устанавливается в конструкторе (hardcoded). У меня есть функция getter, которая возвращает строку. В другом файле у меня есть экземпляр utils (указатель). Когда я вызываю функцию getter, он возвращается пустым.Функция Getter возвращает неправильное значение?

main.cpp

utils* myUtils = new utils(); 

std::cout << myUtils->getSolutionDir() + " is the current directory" << std::endl; 

delete myUtils; 

utils.hpp

public: 
    utils(); 
    ~utils(); 
    std::string getSolutionDir(); 
private: 
    std::string _solutionDir; 

utils.cpp

utils::utils() { 
    std::string _solutionDir = "C:\\Users\\user\\Documents\\Coding\\CodeBlocks\\MettaRPG"; 
} 
utils::~utils() {} 

std::string utils::getSolutionDir() { 
    return _solutionDir; 
} 

ВЫХОД (GCC компилятор):

представляет собой трет он текущий каталог

+1

'станд :: строка _solutionDir' в теле конструктора тени переменного-член. Опустите объявление типа. –

+0

есть ли причина, почему вы используете 'new' и' delete' здесь? 'utils myUtils;' и никакое 'delete' не будет делать так же – user463035818

+0

Я хотел передать myUtils в другой класс с инъекцией зависимости. Я думал, что это улучшит производительность. – Melkor

ответ

2

Посмотрите на эту линию в конструкторе:

std::string _solutionDir = "C:\\Users\\user\\Documents\\Coding\\CodeBlocks\\MettaRPG"; 

Эта линия Объявляет локальная переменная имени _solutionDir и устанавливает, что равное указанной строке, вместо того, существующая элемент данных с именем _solutionDir и изменение его значения. Чтобы устранить это, удалите std::string из этой строки.

В качестве альтернативы, если у вас есть C++ 11 компилятора, считаю просто изменить свой класс, чтобы выглядеть следующим образом:

public: 
    ~utils(); 
    std::string getSolutionDir(); 
private: 
    std::string _solutionDir = "C:\\Users\\user\\Documents\\Coding\\CodeBlocks\\MettaRPG";