我是这个社区的新手,也是C ++的新手,我正试图让我的程序运行。 我正在尝试使用Bruce Eckel在C ++中进行思考练习,在那里,我将使用他的Stack实现并更改其构造函数,以便它将对象的指针数组和该数组的大小作为其参数。然后构造函数应该遍历数组并将每个指针推送到堆栈上。 这是他对Stack的实现,可以在他的网站上找到:
//: C04:Stack.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Linked list with nesting
#include "Stack.h"
#include "require.h"
using namespace std;
Stack::Link::Link(void* dat, Link* nxt) {
data = dat;
next = nxt;
}
Stack::Link::~Link() { }
Stack::Stack() { head = 0; }
void Stack::push(void* dat) {
head = new Link(dat, head);
}
void* Stack::peek() {
require(head != 0, "Stack empty");
return head->data;
}
void* Stack::pop() {
if(head == 0) return 0;
void* result = head->data;
Link* oldHead = head;
head = head->next;
delete oldHead;
return result;
}
Stack::~Stack() {
require(head == 0, "Stack not empty");
} ///:~
我没有收录他的头文件。现在,我能够提出的所有内容都是这样的:
Stack::Stack(void** vp, int size) {
head = 0;
for (int i = 0; i < size; i++)
this->push((void*)vp[i]);
}
我尝试用以下方式运行它:
#include "Stack.h"
using namespace std;
struct product {
char ch;
float price;
};
int main(int argc, char **argv) {
product p1, p2, p3, p4;
p1.ch = 'a'; p1.price = 1.1;
p2.ch = 'b'; p2.price = 1.2;
p3.ch = 'c'; p3.price = 1.3;
p4.ch = 'd'; p4.price = 1.4;
product* ptr1 = &p1;
product* ptr2 = &p2;
product* ptr3 = &p3;
product* ptr4 = &p4;
product* ptr_arr[] = {ptr1, ptr2, ptr3, ptr4};
Stack st(ptr_arr, 4);
我得错误无法从产品**转换为void * 。我不应该使用void *作为构造函数的参数吗?我怎样才能传递包含指向未知数据类型的指针的数组,在本例中是struct Product?问题是当我简单地从产品**转换为void **而不使用Stack时,我没有遇到任何问题,所以我认为错误实际上是在我的“构造函数”中。 正如我所说,我是C ++的初学者,可能是我犯了一些非常简单的错误,但我似乎无法弄清楚我还能做些什么呢。感谢所有提前,任何帮助都会被激活!
答案 0 :(得分:1)
您可以使用void*
指向任何内容,但void**
不是。{
void*
;它指向void*
。而product*
不是void*
(它
甚至可以有不同的大小或代表性)。如果你想
传递一个指向指针数组的指针,你需要传递它
数组中指针的类型,如果要使用void**
,
你必须有一个void*
数组。
我不清楚您的代码与原始代码有什么关系,
甚至你真正想做的事情。 (Stack::Stack
是一个
构造函数。什么课?)