Person(std::string name, int rangeStance, int initialStance) {
name = name;
Здесь происходит то, что он просто перезаписывает параметр самим собой, а не копирует его в переменную-член. Это потому, что правила поиска имен для неквалифицированных имен в этот момент предпочитают параметр переменной-члену. Это означает, что переменная-член остается в созданном состоянии, в пустой строке.
Есть несколько способов исправить это. Во-первых, просто назовите их по-другому, чтобы не было двусмысленности, например, обычный метод префикса переменных-членов с помощью m_
. Таким образом, оператор становится более явным:
m_name = name;
Другой альтернативой является явный тот, который вы назначаете, чтобы он больше не был неквалифицированным:
this->name = name;
Третий - использовать списки инициализаторов, правила которых немного отличаются тем, что они используют переменную-член вне круглых скобок и выполняют обычный неквалифицированный поиск в скобках:
Person(std::string name, int rangeStance, int initialStance)
: name(name)
, rangeStance(rangeStance)
, initialStance(initialStance)
// ^ ^
// | |
// | +- normal lookup, passed-in parameter.
// +--------------- member variable.
{
};
И нет необходимости иметь все эти другие операторы в конструкторе, такие как setName(getName())
, поскольку вы уже задали имя.