2011-10-18 63 views
1

我是這個社區的新手,並且是C++的新手,這是我試圖讓我的程序運行的地方。 我正在用Bruce Eckel在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作爲構造函數的參數void * *?我還可以傳遞一個包含指向未知數據類型的指針的數組,在這種情況下,struct Product?問題是,當我簡單地從產品**投向void **時,根本沒有使用Stack,我沒有遇到任何問題,所以我發現錯誤實際上是在我的「構造函數」中。 正如我所說的,我是C++的初學者,也可能是我犯了一些非常簡單的錯誤,但我似乎無法弄清楚我該怎麼做。感謝所有的提前,任何幫助將被扣留!

+3

你可能不應該使用void指針作爲* anything *,而是使用C++中的內存分配。 –

回答

1

可以使用void*指向任何東西,但void**不是 void*;它指向void*。並且product*不是void*(其 甚至可以具有不同的大小或表示)。如果您想要 傳遞一個指向數組指針的指針,則需要將數組中指針的類型 傳遞給它,如果要使用void**, ,則必須有一個void*的數組。

我不清楚你的代碼與原始代碼有什麼關係, ,甚至你真的想做什麼。 (Stack::Stack是一個 的構造函數,對於什麼類?)

+0

練習說明我應該爲堆棧對象實現一個新的構造器......即,它屬於Stack類,它是一個採用參數array *和int size的方法,然後這個「構造函數」應該用指向對象的指針填充堆棧。當我有用戶定義類型(如Product)時,我該如何去做這件事?感謝您的答覆btw! – user999318

+0

如果構造函數使用'void **',則必須將其傳遞給'void *'數組。數組中的元素可以用任何類型的地址初始化;例如'void * initValues [] = {&p1,&p2,&p3,&p4 };' –

+0

這非常合理!謝謝。我應該從你的第一條評論中明白這一點......儘管......我確實有一個問題,這在概念上是正確的嗎?我的意思是,不管事實如何,它是如何存儲指向未知類型對象的指針,還是有更好的方法?我看到很多人說我不應該使用void指針,但替代方法是什麼? – user999318