2009-03-17, 23:29
#1
Brjade att skriva en lng frklaring och bakgrund till koden nedan men kom p att jag nog bara frvirrar mer n frklarar.
Tror problemet kan sammanfattas till: Jag har en vektor av pekare till en basklass dr varje pekare pekar p en deriverad klass. Kan jag ta en pekare ur vektorn och skapa en ny instans av den deriverade klassen samt kopiera ver data till kopian utan att behva anvnda runtime type identification och static_cast som i kodsnutten nedan?
Tror problemet kan sammanfattas till: Jag har en vektor av pekare till en basklass dr varje pekare pekar p en deriverad klass. Kan jag ta en pekare ur vektorn och skapa en ny instans av den deriverade klassen samt kopiera ver data till kopian utan att behva anvnda runtime type identification och static_cast som i kodsnutten nedan?
Kod:
#include <iostream> #include <vector> #include <stdlib.h> using namespace std; class A { int data; public: A() {data = 0;}; A(int d) {data = d;}; virtual void calculate(int i) {cout << "calculate" << endl;}; }; class B : public A { int data; public: B() {data = 0;}; B(int d) {data = d;}; void calculate(int i) {cout << "data: " << data + i << endl;}; }; class C : public A { int data; public: C() {data = 0;}; C(int d) {data = d;}; void calculate(int i) {cout << "data: " << data * i << endl;}; }; int main() { vector<A*> database; for(int i = 0; i < 10; i++) { database.push_back(new B(rand()%100)); database.push_back(new C(rand()%100)); } vector<A*> randoms; for(int i = 0; i < 10; i++) { int random = rand()%10; if(typeid(*database[random]) == typeid(B)) { B* b = new B; *b = *static_cast<B*>(database[random]); randoms.push_back(b); } else if(typeid(*database[random]) == typeid(C)) { C* c = new C; *c = *static_cast<C*>(database[random]); randoms.push_back(c); } else cout << "Unkown..." << endl; } for(int i = 0; i < 10; i++) randoms[i]->calculate(rand()%100); }