2

繰り返しになりますが、この質問は「C ++で考える」第7章Q#7からも発信されています。StackヘッダーファイルをStack.hに変更する必要があると思います

        #ifndef STACK_H
        #define STACK_H

        class Stack {
          struct Link {
            void* data;
            Link* next;
            Link(void* dat, Link* nxt);
            ~Link();
          }* head;
        public:
          Stack();
          Stack(void* arr[], int size);
          ~Stack();
          void push(void* dat);
          void* peek();
          void* pop();
        };

Stack.cppでのStack::Stack(void * arr []、int size)の実装は、次のようになると思います。

       Stack::Stack(void* arr[], int size)
       {
         for (int i=0; i<size; i++)
          {
            push(arr[i]);
          }
       }

ただし、メインのテストファイルStackTest.cppで、文字列配列のアドレスをこのコンストラクターに渡すにはどうすればよいですか?これが私が思いついたものです:

          #include "Stack.h"
          #include "require.h"
          #include <iostream>
          #include <string>
          using namespace std;

          int main() {

            string tst_arr[] = {"hi 1", "hi 2", "hi 3"};
            Stack string_arr((void**)tst_arr, 3);
            string* s;
            while((s = (string*)string_arr.pop()) != 0) {
              cout << *s << endl;
              delete s;
            }
          } 

しかし、セグメンテーション違反があります。Stack :: Stack(void * arr []、int size)をStack :: Stack(string arr []、int size)に変更することも考えられますが、質問の要件を満たしていません。たとえば文字列を含むジェネリックオブジェクトを格納するためのStackの目的。void *ポインターとポインターの配列の概念、および文字列配列とvoid *配列の間の違いなどを理解するのはまだ難しいと思います...誰かがこの問題を解決するのを手伝ってくれるでしょうか?どうもありがとう!!

4

1 に答える 1

2

Stackコンストラクターは、ものに対するポインターの配列を要求し、それにオブジェクトの配列を与えます。ボーナスとして、私はあなたに適切な主な機能とメモリを解放することを与えます^^

#include <cstdlib>
// --- Includes your stuffs ---

using namespace std;

int main(int argc, char* argv[]) {
  string* tst_arr[] = new string[3];
  tst_arr[0] = new string("hi 1");
  tst_arr[1] = new string("hi 2");
  tst_arr[2] = new string("hi 3");
  Stack string_arr((void**)tst_arr, 3);

  // --- Do your stuffs ---

  for(int i =0; i < 3; ++i)
    delete tst_arr[i];
  delete[] tst_arr;

  return EXIT_SUCCESS;
}
于 2011-03-30T00:59:56.540 に答える