【发布时间】:2011-07-25 17:05:30
【问题描述】:
同样,这个问题也源自“Thinking in C++”Chapter7, 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* 数组等之间的变化......任何人都可以帮我解决这个问题吗?非常感谢!!
【问题讨论】:
-
(void **)tst_arr在技术上是错误的,尽管它可能不是问题的根源。 -
呃,我想说放弃这种精神错乱。无论如何,您不会以这种方式学习任何有用的东西(
void*根本不应该在 C++ 中使用)。首先学习模板,然后尝试编写你的堆栈(然后再一次,不要在实际代码中使用它——改用标准库容器)。 -
“用 C++ 思考”显然是用词不当。这家伙用 C 语言思考。
-
每次你以
void**结束时,你就知道你很多了。别管它!
标签: c++ arrays pointers stack void-pointers