C ++ Visual Studio 2010, ошибка компиляции C3867 при реализации динамического стека - PullRequest
0 голосов
/ 02 марта 2012

В настоящее время я работаю над заданием для моего класса структур данных в университете, используя стеки с динамическим распределением памяти. В настоящее время я получаю ошибку компиляции C3867, говорящую, что я пропускаю вызов функции из списка аргументов. Я не совсем понимаю, откуда эта ошибка / у меня проблемы с определением, что именно является моей ошибкой в ​​моем коде; поэтому мне было интересно, если кто-то может быть достаточно любезен, чтобы объяснить мне, что это, и, возможно, дружеский совет, чтобы помнить, чтобы я не мог повторить это снова.

также, я прошу прощения за плохое форматирование, я никогда не публиковал здесь раньше, извините, если его трудно читать. :(

код выложен ниже.

Спасибо и всего наилучшего. : P

Заголовочный файл:

#ifndef STACK_H
#define STACK_H
#include <iostream>
#include <iomanip>

struct Node
{
    Node *nextPtr;
    int value;
};

class Stack
{
public: 
    //Constructors and Deconstructers Here
    Stack(); //Default Constructor
    ~Stack(); //Default Deconstructor

    //logical methods || functions here
    bool isEmpty(void); //prototype checks if stack is empty

    //stack operations || function prototypes here
    void push(int); //prototype to push values of type int onto the stack
    int pop(); //prototype to pop values off of the stack and return a value
    int top(); //prototype to return the top value
private:
    Node *topPtr; //pointer to class Node Object, specifically for the top of the stack
};   

#endif

Файл класса:

#include "CPTN278_A3_Stack_Arsenault.h"

using namespace std;
Stack::Stack()
{
    topPtr = 0; //set the top pointer equal to zero.
}

Stack::~Stack()
{
    while (!Stack::isEmpty())
    {
        Stack::pop();
    }
}

bool Stack::isEmpty()
{
    if(top == 0)
    {
        return true;
    }
    else
    {
        return false;
    } 
}

void Stack::push(int valueTMP)
{
    Node *itemPtr = new Node; 
    itemPtr->nextPtr = topPtr; 
    itemPtr->value = valueTMP;
    topPtr = itemPtr;
    return;
}

int Stack::pop()
{
    int returnValue; //unintialized int
    Node *itemPtr; //unintialized pointer to node
    returnValue = topPtr->value;
    itemPtr = topPtr;
    topPtr = itemPtr->nextPtr;
    delete itemPtr;
    return returnValue;
}

int Stack::top(void)
{
    return topPtr->value; //**this is where my error is being thrown**
}

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

До того, как вы получили:

bool Stack::isEmpty()
{
    if(top == 0) <-- top is a function, did you mean 'topPtr'?
    {
        return true;
    }
    else
    {
       return false;
    } 
}

Исправлено:

bool Stack::isEmpty()
{
    return topPtr == 0;
}

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

if (expression_that_is_true_or_false)
    return true;
else
    return false;

Просто сделай:

return expression_that_is_true_or_false;

Я мог бы быть пограничным проповедующим стилем, но постараюсь привыкнуть к пониманию выражений таким образом. Выражения, включающие логические операторы, такие как ==,! =, &&, ||, <,> и т. Д., Оцениваются как true или false, поэтому нет необходимости выполнять условное ветвление только для того, чтобы затем возвращать то, что выражение, первоначально оцененное в первом место.

Да, и я понимаю, что это домашнее задание, но проверьте std :: stack позже, в свободное время, если вы этого еще не сделали.

2 голосов
/ 02 марта 2012
bool Stack::isEmpty()
{
    if(top == 0) // <-- here is the problem
    {
        return true;
    }
    else
    {
        return false;
    } 
}

top - это функция, для проверки результата вам нужно top(). Но я думаю, что вы должны тестировать topPtr вместо.

0 голосов
/ 02 марта 2012

В функции Stack::isEmpty(), что-то не так с top.

bool Stack::isEmpty()
{
  if(top == 0) // here
  {
    return true;
  }
  else
  {
    return false;
  } 
}

Я думаю, что это должно быть так:

  if(topPtr==0)
  ...
...