C ++ Object - Private int возвращает странные значения - PullRequest
6 голосов
/ 24 ноября 2010

Я учил себя C ++ и начал создавать органайзер списков для работы над концепцией указателей.

Я определил класс с именем List, который имеет три свойства:

int itemTotal;
Item* firstItem;
Item* lastItem;

Конструктор устанавливает их значения как:

itemTotal = 0;
firstItem = NULL;
lastItem = NULL;

Я построил функцию, которая возвращает значение itemTotal:

int List::getItemTotal()
{
    return itemTotal;
}

Сразу после создания объекта в моем драйвере itemTotal начинает вести себя забавно и возвращает действительно большие числа (-858993460 каждый раз), даже если в Списке не было выполнено никакой работы и буквально ничего не произошло в программе. Я добавил cout в конструктор, просто чтобы посмотреть, что там происходит, и он выводит значение 0, но как только этот конструктор будет выполнен, значение немедленно изменится.

Я пытался проработать это с моими книгами и поиграть с этим, но я не могу решить проблему, поэтому решил, что обращусь к кому-то с большим опытом. Основное находится ниже:

int main()
{
    List grocery;
    cout << "itemTotal is now: " << grocery.getItemTotal() << endl; // Returns wrong value...


    system("Pause");
    return 0;
}

С выводом, похожим на:

grocery List is built!
itemTotal inside of the constructor is 0!
itemTotal is now: -858993460

Есть идеи? = /

EDIT: По запросу весь класс (извините, уродливое форматирование, я не хочу делать все заново):

class List
{
public:
// Constructor
// Purpose: Builds object.
// Returns: Nothing.
// Pre-Conditions: None.
// Post-Conditions: Initializes null.
List();

// push_back function
// Purpose: Adds Item to end of List.
// Returns: None.
// Pre-Conditions: Must pass a declared Item object.
// Post-Conditions: None.
void push_back(Node*);

// push_front function
// Purpose: Adds Item to beginning of List.
// Returns: None.
// Pre-Conditions: Must pass a declared Item object.
// Post-Conditions: None.
void push_front(Node*);

// pop_back function
// Purpose: Removes last Item from List. Item is NOT deleted.
// Returns: Pointer to removed Item.
// Pre-Conditions: None.
// Post-Conditions: None.
Node* pop_back();

// pop_front function
// Purpose: Removes first Item from List. Item is NOT deleted.
// Returns: Pointer to removed Item.
// Pre-Conditions: None.
// Post-Conditions: None.
Node* pop_front();

// getFirst function
// Purpose: Returns pointer to first Item in List.
// Returns: Pointer.
// Pre-Conditions: List must have a Item object.
// Post-Conditions: None.
Node* getFirst();

// getItemTotal function
// Purpose: Returns the itemTotal
// Returns: Int
// Pre-Conditions: None.
// Post-Conditions: None.
int getItemTotal();
private:
Item* firstitem;
Item* lastitem;
int itemTotal;

}

и конструктор:

List::List()
{
Item* firstNode = NULL;
Item* lastNode = NULL;
int itemTotal = 0;
cout << "item total should start at 0, it is " << nodeTotal << " inside of the constructor." << endl;
}

Ответы [ 4 ]

7 голосов
/ 24 ноября 2010

Хааа! Вы инициализируете локальную переменную в конструкторе, а не в члене !! Вместо int itemTotal = 0; напишите this->itemTotal = 0; или просто itemTotal = 0 или даже используйте список инициализации конструктора, подобный этому

List::list()
   :itemTotal(0),
    firstNode(NULL),
    lastNode(NULL)   
{
   cout << "List ctor Called"
}
4 голосов
/ 24 ноября 2010

Вы объявили локальные значения в вашем конструкторе с тем же именем, что и члены.Они скрывают значение членов, поэтому, когда вы устанавливаете itemTotal = 0;, вы на самом деле просто устанавливаете значение локальной переменной.Ваш конструктор должен выглядеть так:

List::List()
    :itemTotal(0), firstNode(NULL), lastNode(NULL)
{
    cout << "item total should start at 0, it is " << itemTotal << " inside of the constructor." << endl;

}
2 голосов
/ 24 ноября 2010

Ваша проблема в том, что вы объявляете локальные переменные внутри конструктора, которые скрывают переменные-члены:

List::List()
{
    Item* firstNode = NULL;  // declares a new variable.
    Item* lastNode = NULL;
    int itemTotal = 0;
    cout << "item total should start at 0, it is " << nodeTotal << " inside of the constructor." << endl;
}

Ваш код должен выглядеть так:лучше, если вы использовали список инициализаторов:

List::List()
    : firstNode(NULL)
    , lastNode(NULL)
    , itemTotal(0)
{
    // Fix this line cout << "item total should start at 0, it is " << nodeTotal << " inside of the constructor." << endl;
}
2 голосов
/ 24 ноября 2010

Вы инициализируете локальные переменные, а не члены класса.

Замените:

List::List()
{
Item* firstNode = NULL;
Item* lastNode = NULL;
int itemTotal = 0;
cout << "item total should start at 0, it is " << nodeTotal << " inside of the constructor." << endl;
}

На:

List::List()
{
  firstNode = NULL;
  lastNode = NULL;
  itemTotal = 0;
  cout << "item total should start at 0, it is " << nodeTotal << " inside of the constructor." << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...