私はこのコミュニティには新しく、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++の初心者です。私は非常に単純なエラーを出すかもしれませんが、私はこれについて他にどのようにできるのかわかりません。すべてのおかげで、どんな助けも気にすることはありませんでした!
C++では* anything *にはvoidポインタは使用しないでください。 –