2009-03-17, 23:29
  #1
Medlem
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?

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);
}
Citera
2009-03-18, 01:33
  #2
Medlem
Copy

Implementera en virtuell metod "Copy" i basklassen, och lt sedan de deriverade underklasserna implementera den, genom att returnera en pekare till ett objekt av antingen typ B eller C.
Citera
2009-03-19, 15:56
  #3
Medlem
blueCommands avatar
Sedan r det vl dynamic_cast som anvnder RTTI?
Citera
2009-03-19, 18:12
  #4
Medlem
Citat:
Ursprungligen postat av Storstamp
Implementera en virtuell metod "Copy" i basklassen, och lt sedan de deriverade underklasserna implementera den, genom att returnera en pekare till ett objekt av antingen typ B eller C.

Tack fr ditt svar, men tyvrr frstr jag inte riktigt hur du menar. Ska jag verlagra copy-konstruktorn? Om jag bara returnerar en pekare hur ser jag d till att kopiera ver data till det nya minnesutrymmet?

r det frresten ens mjligt att komma undan att identifiera vilken deriverad klass det rr sig om? Nr jag allokerar nytt minnesutrymme mste jag vl veta klassen? Om jag bara allokerar minne fr basklassen och kopierar ver data dit frlorar jag ju typinformationen och basklassens funktioner kommer att anropas.
Citera
2009-03-19, 18:19
  #5
Medlem
Citat:
Ursprungligen postat av Draupen
r det frresten ens mjligt att komma undan att identifiera vilken deriverad klass det rr sig om? Nr jag allokerar nytt minnesutrymme mste jag vl veta klassen?
Det rcker med att den deriverade klassen vet vilken klass den sjlv r. Den har d en copy constructor som allokerar rtt mngd minne t dig. Det lser sig med andra ord av sig sjlv om du implementerar copy constructors p rtt stt i de deriverade klasserna.
Citera
2009-03-19, 18:21
  #6
Medlem
kaks avatar
Klona objekten
http://www.parashift.com/c++-faq-lit....html#faq-20.8
Citera
2009-03-19, 18:21
  #7
Medlem
Citat:
Ursprungligen postat av blueCommand
Sedan r det vl dynamic_cast som anvnder RTTI?

Eftersom jag anvnt typeid fr att veta vilket klass jag ska allokera minnesutrymme fr s tnkte jag att det r lika bra att anvnda static_cast. Det ska ju vara lite snabbare n dynamic_cast och med typeid-checken frst s borde det vara skert att gra.
Citera
2009-03-19, 18:32
  #8
Medlem
Citat:
Ursprungligen postat av kak
Klona objekten
http://www.parashift.com/c++-faq-lit....html#faq-20.8

Tack! Fungerar perfekt, nu blev koden mycket snyggare
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in