2017-10-08 2 views
0

Ich möchte in GameObject Klasse einen Vektor von Objekten haben, die von A Klasse erbt, und eine Vorlage-Methode, die neue Objekte des Schablonentyps zum Vektor hinzufügen wird.C++ - Fehler bei der Verwendung von Array von void-Zeigern

Aber ich möchte die Möglichkeit haben Konstrukteure verwenden, mit den Parametern der unbekannten Art, so möchte ich void-Zeiger-Array verwenden, das zu tun, aber ich habe einen Fehler zu sagen:

mit Nicht-Null verlassen

Status

Hier ist der Code:

#include <iostream> 
#include <string> 
#include <vector> 

class A 
{ 
public: 

    virtual void whatever() { std::cout << "okay\n"; } 
}; 

class B : public A 
{ 
public: 
    float a; 
    std::string b; 
    int c; 

    void print() 
    { 
     std::cout << "a,b,c values: " << a << ", " << b << ", " << c << std::endl; 
    } 

    B(void * parameters[]) 
    { 
     this->a = *(static_cast<float*>(parameters[0])); 
     this->b = *(static_cast<std::string*>(parameters[0])); 
     this->c = *(static_cast<int*>(parameters[0])); 
    } 
}; 

class GameObject 
{ 
public: 
    std::vector<A*> components{}; 

    template<class T> 
    void AddComponent(void * parameters[]) 
    { 
     auto t = new T(parameters); 
     components.push_back(t); 
    } 
}; 

int main() 
{ 
    float f = 2524.218f; 
    std::string s = "str"; 
    int i = 4214; 

    auto g = new GameObject; 

    void* ptr[3]; 

    ptr[0] = &f; 
    ptr[1] = &s; 
    ptr[2] = &i; 

    g->AddComponent<B>(ptr); 
    static_cast<B*>(g->components[0])->print(); 
} 

können Sie mir sagen, was das Problem ist und wenn es möglich ist, korrigieren Sie den Code?

+0

Wollten Sie wirklich den gleichen Array-Eintrag 3 verschiedenen Variablen zuweisen? Dies scheint eine schreckliche Designwahl zu sein. –

+2

'Parameter [0]' kann nicht gleichzeitig ein Zeiger auf ein 'float', ein Zeiger auf ein' int' und ein Zeiger auf 'std :: string' sein. Denken Sie darüber nach, was Sie versuchen, es als String zu dereferenzieren, wenn es keine Zeichenfolge ist. Und lerne über [* undefined behaviour *] (http://en.cppreference.com/w/cpp/language/ub). –

Antwort

1
this->a = *(static_cast<float*>(parameters[0])); 
    this->b = *(static_cast<std::string*>(parameters[0])); 
    this->c = *(static_cast<int*>(parameters[0])); 

Meinten Sie:

this->a = *(static_cast<float*>(parameters[0])); 
    this->b = *(static_cast<std::string*>(parameters[1])); 
    this->c = *(static_cast<int*>(parameters[2])); 

D.h. Verwenden Sie verschiedene Array-Indizes.

Verwandte Themen