Неверное преобразование из (некоторого класса) ** в недействительное ** - PullRequest
1 голос
/ 18 октября 2011

Я новичок в этом сообществе и новичок в C ++, где я пытаюсь запустить мою программу.Я пытаюсь выполнить упражнение в Thinking in C ++ Брюса Эккеля, и там я должен использовать его реализацию стека и изменить его конструктор так, чтобы он принимал в качестве аргументов массив указателей на объекты и размер этого массива.Затем конструктор должен перемещаться по массиву и помещать каждый указатель в стек.Вот его реализация 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 * в качестве аргумента для конструктора?Как еще можно передать массив, содержащий указатели, на неизвестный тип данных, в данном случае это структура Product?Дело в том, что когда я просто преобразую из product ** в void ** в main, вообще не используя Stack, у меня не возникает проблем, поэтому я предполагаю, что ошибка на самом деле в моем «конструкторе».Как я уже сказал, я новичок в C ++, и, возможно, я делаю какую-то очень простую ошибку, но я, похоже, не могу понять, как еще я мог бы пойти по этому поводу.Спасибо всем заранее, любая помощь будет признательна!

1 Ответ

1 голос
/ 18 октября 2011

Вы можете использовать void*, чтобы указать на что-либо, но void** не является void*; это указывает на void*. И product* это не void* (это может даже иметь другой размер или представление). Если хотите передать указатель на массив указателей, вам нужно передать его с тип указателей в массиве, и если вы хотите использовать void**, вам нужно иметь массив void*.

Мне не ясно, какое отношение ваш код имеет к оригиналу, и даже то, что вы действительно пытаетесь сделать. (Stack::Stack является конструктор. Для какого класса?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...