std :: cout строки не работает - PullRequest
1 голос
/ 28 октября 2011

У меня есть класс State с типом данных string с именем moveType. При реализации моего кода я вызываю сеттер void setMoveType(string _moveType);, и он реализован просто moveType = _moveType;

Когда я вызываю свой геттер string getMoveType() const; в экземпляре State и выводю его в cout, ничего не отображается.

Я слежу за входом в функцию getMoveType(). Параметр действительно имеет правильное значение, но, похоже, он вообще не устанавливается.

У кого-нибудь есть идеи? Я чувствую, что это что-то простое / тривиальное в C ++, которое я просто полностью забыл.

string  State::getMoveType() const {
    return moveType;
}

void State::setMoveType(string move_type)  {
    cout << "In setMoveType and param = " << move_type << endl;
    moveType = move_type;
}

std::cout << vec_possibleSuccessors[i].getMoveType() << endl; // within loop;

vector<State> vec_possibleSuccessors;

    if (_minState.canMoveUp()) {
        up = _minState.moveUp();
        up.setMoveType("UP");
        up.setF(f(up));
        vec_possibleSuccessors.push_back(up);
    }

В приведенном выше коде _minState и up являются экземплярами State. Кроме того, я убедился, что мой конструктор копирования и оператор присваивания были изменены для включения moveType присваиваний.

Ответы [ 3 ]

2 голосов
/ 28 октября 2011

На самом деле не достаточно кода, чтобы знать наверняка, но у меня есть предположение: либо вы фактически присвоили затененную переменную в функции «set» и никогда не устанавливали атрибут class вообще, либо ваш объект State фактически имелбыла уничтожена, и строка становится пустой (поскольку пустая является одним из возможных вариантов при использовании уничтоженной памяти).

1 голос
/ 28 октября 2011

Ну, не ответ, а короткий пример, который работает так, как вы, похоже, намереваетесь это сделать:

#include <string>

class State
{
  private:
    std::string m_moveType;

  public:
    State() : m_moveType( "unknown" ) {}

   std::string getMoveType() const { return m_moveType; }
   void setMoveType( const std::string& moveType ) { m_moveType = moveType; }
};

В вашей основной функции или вам нужен вектор состояний, который вы могли бы написать так:

#include <iostream>
#include <vector>
#include "State.h"

int main()
{
  std::vector< State > states;
  for( int i=0; i<10; ++i )
  {
    State newState;
    newState.setMoveType( "state" );
    states.push_back( newState );
  }

  // do whatever you need to do....
  std::vector< State >::iterator it;
  std::vector< State >::iterator end = states.end();
  for( it=states.begin(); it != end; ++it )
    std::cout << (*it).getMoveType() << std::endl;

  return 0;
}

Несколько замечаний:

  • передача параметров по значению, например, setMoveType (строка s) не
    рекомендуется, вместо этого, передать константные ссылки . Передача по значению влечет за собой полная копия пройденного объекта
  • будьте осторожны с включениями и пространствами имен, в случае сомнения займите дополнительное время введите std :: ... , если вы собираетесь использовать функцию, определенную в пространстве имен std и никогда не вводите , используя пространство имен std в заголовочном файле.
  • инициализировать закрытых членов по умолчанию и делать это в классе список инициализаторов
1 голос
/ 28 октября 2011

Я тоже не уверен в этом, но вы, кажется, храните это состояние в векторе. Не могли бы вы опубликовать код, как вы устанавливаете элементы в векторе? Важно отметить, что вы не можете обновить элемент в векторе после его вставки (если вы не сохраните указатель на элемент). Также в зависимости от того, как вы называете набор, могут быть проблемы.

...