从(某类)**到void**的转换无效

Invalid conversion from (some-class)** to void**

本文关键字:转换 无效 void 某类      更新时间:2023-10-16

我是这个社区的新手,也是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);

,我得到错误不能从product**转换为void*。我不应该使用void*作为构造函数的参数吗?我怎么能传递一个数组,其中包含指针到一个未知的数据类型,在这种情况下,结构产品?问题是,当我在main中简单地从product**转换为void**时,根本没有使用Stack,我没有遇到任何问题,所以我假设错误实际上是在我的"构造函数"中。正如我所说,我是c++的初学者,可能是我犯了一些非常简单的错误,但我似乎不知道我还能怎么做。感谢所有提前,任何帮助将不胜感激!

您可以使用void*指向任何东西,但void**不是avoid*;它指向一个void*product*不是void*(它)甚至可以有不同的大小或表示)。如果你想传递一个指针到一个指针数组,你需要用数组中指针的类型,如果你想使用void**,你必须有一个void*的数组。

我不清楚你的代码和原来的有什么关系,甚至不知道你真正想做什么。(Stack::Stack是一个构造函数。)