6

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

主文件

#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

4 回答 4

8

这应该足够了:

void displayStack(const Stack<char>& stack);
于 2012-10-25T03:14:12.210 回答
4

该名称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;的 inmain已被删除,因为那是默认的. 然而,一些程序员更喜欢让它显式。

不利的一面是,虽然 C++11 循环可以很好地与 g++ 4.7.2 一起编译,但它会导致Visual C++ 11.0的内部编译器错误 ( ICE ):

[d:\开发\测试]
> cl foo.cpp
foo.cpp
foo.cpp(7) : 警告 C4100: 'stack' : 未引用的形式参数
foo.cpp(16):错误 C2059:语法错误:'{'
foo.cpp(16):错误 C2143:语法错误:缺少 ';' 前 '}'
c1xx:致命错误 C1063:内部编译器错误
         请选择 Visual C++ 上的技术支持命令
         帮助菜单,或打开技术支持帮助文件以获取更多信息

[d:\开发\测试]
> _

那好吧。

按照你的方式去做。;-)

向 Microsoft 报告的编译器错误。

于 2012-10-25T03:26:34.850 回答
1

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

void displayStack(const Stack<char> &starRef)

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

void displayStack(Stack<char> &starRef)

注意事项:

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

将您的 displayStack 函数更改为:

void displayStack(Stack<char> &stackRef)
于 2012-10-25T03:14:58.533 回答