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