массивы пустых указателей - PullRequest
2 голосов
/ 30 марта 2011

опять этот вопрос также возник из "Мышление в C ++" Глава 7, Q # 7.Я считаю, что файл заголовка стека должен быть изменен на 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 :: Stack (void * arr [], int size) в Stack.cpp, я думаю, может быть похожа на:

       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 * и т. Д. Кто-нибудь может помочь мне решить эту проблему?Большое спасибо !!

1 Ответ

2 голосов
/ 30 марта 2011

Ваш конструктор стека запрашивает массив указателей на материалы, а вы передаете ему массив объектов.В качестве бонуса я даю вам правильную основную функцию и освобождаю память ^^

#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;
}
...