将堆栈传递给函数

时间:2012-10-25 03:11:19

标签: c++ function stack

所以我正在玩堆栈,我已经在我的主函数中填充了一个,但是现在我想把它传递给我的其他函数,所以我可以遍历它。我不确定将什么类型的数据类型放入原型中以便它接受它。建议?这就是我所拥有的:

Main.cpp的

#include <iostream>
using namespace std;
#include "stack.h"

void displayStack(char &stackRef);

int main()
{
    Stack<char> stack;
    stack.push('a');
    stack.push('b');
    stack.push('c');

    return 0;
};

void displayStack(char starRef)
{
    // Cannot Get here - Errors!
};

它告诉我我有太多的参数,它与参数列表不匹配。

4 个答案:

答案 0 :(得分:7)

这应该足够了:

void displayStack(const Stack<char>& stack);

答案 1 :(得分:3)

名称DisplayStack表示该功能仅显示堆栈,而不是以任何方式更改堆栈。那么参数可以是const 的引用。但是,名称中的后缀Stack是多余的,因为它是由参数隐含的,所以我会这样做:

#include <iostream>
using namespace std;
#include "stack.h"

typedef Stack< char > CharStack;

void display( CharStack const& stack )
{
    // ... Display the stack
}

int main()
{
    CharStack stack;

    for( auto const ch : { 'a', 'b', 'c' } )
    {
        stack.push( ch );
    }
    display( stack );
}

请注意......

  • 该功能已移至上方 main。那时不需要愚蠢的纯粹宣言,减少工作量。 DRY 不要重复自己

  • 删除了函数定义后的错误分号。好吧,至少我认为他们是不正确的。无论它们是否存在,它们都是多余的。

  • return 0;中多余的main已被删除,因为是默认。但是,有些程序员喜欢明确说明。

在缺点方面,虽然C ++ 11循环与g ++ 4.7.2编译得很好,但它会导致Visual C ++ 11.0的内部编译器错误( ICE ):

[d:\dev\test]
> cl foo.cpp
foo.cpp
foo.cpp(7) : warning C4100: 'stack' : unreferenced formal parameter
foo.cpp(16) : error C2059: syntax error : '{'
foo.cpp(16) : error C2143: syntax error : missing ';' before '}'
c1xx : fatal error C1063: INTERNAL COMPILER ERROR
         Please choose the Technical Support command on the Visual C++
         Help menu, or open the Technical Support help file for more information

[d:\dev\test]
> _

哦,好吧。

按照自己的方式行事。 ; - )

编译器错误reported to Microsoft

答案 2 :(得分:0)

将您的displayStack功能更改为:

void displayStack(Stack<char> &stackRef)

答案 3 :(得分:0)

如果您不想在函数内修改堆栈的内容:

void displayStack(const Stack<char> &starRef)

如果要在函数内修改堆栈的内容:

void displayStack(Stack<char> &starRef)

注意事项:

  • 传递的变量的类型必须是您在函数原型中提到的类型
  • 在C / C ++中,默认情况下,函数的所有参数都通过copy 传递,即:参数的副本而不是参数本身传递给函数。开销就是副本。您通过引用传递以避免传递的变量副本的开销。
  • 如果希望传递的变量在函数中不可变,则在参数上使用const限定符。