这个问题再次出现在“Thinking in 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 *数组等之间的chagne ...任何人都可以帮我解决这个问题?非常感谢!!
答案 0 :(得分: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;
}