6

スタックをいじって、メイン関数に1つ入力しましたが、他の関数に渡して、スタックをトラバースできるようにします。プロトタイプにどのようなデータ型を入れて受け入れるかはわかりませんが。提案?これが私が持っているものです:

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

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に移動しました。その場合、ばかげた純粋な宣言は必要なく、作業も少なくて済みます。ドライ自分を繰り返さないでください

  • 関数定義の後の誤ったセミコロンは削除されました。まあ、少なくとも私はそれらが間違っていると思います。それらがそうであるかどうかにかかわらず、それらは完全に不要です。

  • これがデフォルトであるため、余分な入力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):警告C4100:'スタック':参照されていない仮パラメーター
foo.cpp(16):エラーC2059:構文エラー:'{'
foo.cpp(16):エラーC2143:構文エラー:';'がありません 前 '}'
c1xx:致命的なエラーC1063:内部コンパイラエラー
         VisualC++でテクニカルサポートコマンドを選択してください
         詳細については、[ヘルプ]メニューを表示するか、テクニカルサポートのヘルプファイルを開いてください。

[d:\ dev \ test]
> _

しかたがない。

それをあなたのやり方でやってください。;-)

Microsoftに報告されたコンパイラのバグ。

于 2012-10-25T03:26:34.850 に答える
1

関数内のスタックの内容を変更したくない場合:

void displayStack(const Stack<char> &starRef)

関数内のスタックの内容を変更する場合:

void displayStack(Stack<char> &starRef)

注意点:

  • 渡される変数のは、関数プロトタイプで言及する型でなければなりません。
  • C / C ++では、デフォルトでは、関数へのすべての引数はコピーによって渡されます。つまり、引数自体ではなく、引数のコピーが関数に渡されます。オーバーヘッドはコピーです。渡される変数のコピーのオーバーヘッドを回避するために、参照によって渡されます。
  • const渡された変数を関数内で不変にしたい場合は、引数に修飾子を使用します。
于 2012-10-25T03:15:53.030 に答える
0

displayStack関数を次のように変更します。

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