繰り返しになりますが、この質問は「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 *配列の間の違いなどを理解するのはまだ難しいと思います...誰かがこの問題を解決するのを手伝ってくれるでしょうか?どうもありがとう!!