c++ - 从 (some-class)** 到 void** 的无效转换

标签 c++ void-pointers

我是这个社区的新手,也是 C++ 的新手,这是我试图让我的程序运行的地方。 我正在尝试 Bruce Eckel 的 Thinking in 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* 作为构造函数的参数吗?我还能如何传递包含指向未知数据类型的指针的数组,在本例中为结构产品?问题是,当我在 main 中简单地从 product** 转换为 void** 时,根本没有使用 Stack,我没有遇到任何问题,所以我假设错误实际上是在我的“构造函数”中。 正如我所说,我是 C++ 的初学者,可能是我犯了一些非常简单的错误,但我似乎无法弄清楚我还能如何解决这个问题。在此先感谢大家,我们将不胜感激!

最佳答案

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

我不清楚你的代码与原始代码有什么关系, 甚至你真正想做什么。 (Stack::Stack 是一个 构造函数。上什么课?)

关于c++ - 从 (some-class)** 到 void** 的无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7808988/

相关文章:

c++ - 为什么 C++ 无法推断模板化的非类型模板参数?

c++ - 如何修复 "There too many argument in this opreator"

c++ - C++ vtable 方法是如何排序的 *在实践中*

c - 通过分解空指针来显着减少编译代码大小

c++ - union 与 static_cast(void*)

c++ - 根据另一个数字的整除率返回子数组中的索引

c++ - vector 在将其元素的引用推回到自身时如何工作?

c - void * 到底是什么意思

c - 当我知道每个元素的大小时,如何从指向数组的空指针获取项目?

c - 如何将结构中的空指针分配给另一个结构?