2011-10-18 19 views
1

私はこのコミュニティには新しく、C++には新しく、これは自分のプログラムを実行しようとしています。 私はBruce EckelのThinkingのThinkingでエクササイズを試しています。そこではStackの実装を使用してそのコンストラクタを変更して、引数としてオブジェクトへのポインタの配列とその配列のサイズをとります。コンストラクタは配列内を移動し、各ポインタをスタックに押します。私は彼のヘッダファイルが含まれていない(some-class)**からvoid **への無効な変換**

//: 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ですか?問題は、私が単純にmainからvoid **へキャストすると、Stackをまったく使用しなくても何の問題もないので、実際には私の "コンストラクタ"にエラーがあると言います。 私が言ったように、私はC++の初心者です。私は非常に単純なエラーを出すかもしれませんが、私はこれについて他にどのようにできるのかわかりません。すべてのおかげで、どんな助けも気にすることはありませんでした!

+3

C++では* anything *にはvoidポインタは使用しないでください。 –

答えて

1

あなたは何を指すようにvoid*を使用することができますが、void**void*ではありません。それはvoid*を指しています。 product*void*ではありません( はサイズや表記が異なる場合もあります)。 にポインターの配列へのポインターを渡したい場合は、 ポインターのタイプで配列に渡す必要があります。void**、 を使用する場合は、配列をにする必要があります。

コードとの関係がオリジナルの であるかどうか、また実際に何をしようとしているのかはわかりません。 (Stack::Stackは のコンストラクタです。どのクラス?)

+0

練習では、Stackオブジェクトの新しいコンストラクタを実装する必要があると述べています。それはStackクラスに属し、引数array *とint sizeを取るものであり、この "コンストラクタ"はオブジェクトへのポインタでスタックを埋めるべきです。 Productのようなユーザー定義の型がある場合、どうすればこの作業を行うことができますか?返信btwありがとう! – user999318

+0

コンストラクタが 'void **'を取る場合は、 'void *'の配列を渡す必要があります。配列内の要素は、任意の型のアドレスで初期化できます。例えば'void * initValues [] = {&p1、&p2、&p3、&p4 };' –

+0

これは理にかなっています!ありがとうございました。私はあなたの最初のコメントからそれを分かったはずです...私は1つの質問を持っています...これは概念的に正しいのですか?つまり、それが機能しているかどうかに関わらず、型が不明なオブジェクトへのポインタを格納する方法、またはより良い方法があるのでしょうか?私は多くの人がvoidポインタを使うべきではないと言っているのを見ていますが、その代わりに何がありますか? – user999318

関連する問題