2016-07-30 12 views
-2

Ich habe ein Problem, wenn ich eine reine virtuelle Funktion erstellen und diesem mehrere Bereich von Ausgabeformaten zuweisen möchte (wie int, double und char).Multiple Type-Ausgabe in Polymorphie

Ich schrieb unter Code und es funktioniert nur, wenn ich meine abstrakte Klasse eliminiere, die es nicht ist, was ich will.

mein Code:

enter code here 

//class DynamicArray 
 
      //{ 
 
      // public: 
 
      //  virtual void GetData(unsigned int s, int& d) = 0; 
 
      //  virtual void SetData(unsigned int s, int& d) = 0; 
 
      //}; 
 
     
 
     
 
     
 
     class DynamicArrayDouble//: public DynamicArray 
 
     { 
 
      private: 
 
       unsigned int m_Length; 
 
       double* arr; 
 
      public: 
 
       DynamicArrayDouble(unsigned int l) 
 
       { 
 
        m_Length = l; 
 
        arr = new double[m_Length]; 
 
       } 
 
       void SetParam(unsigned int l) 
 
       { 
 
        m_Length = l; 
 
        arr = new double[m_Length]; 
 
       } 
 
       void GetData(unsigned int s, double& d) 
 
       { 
 
        d = arr[s]; 
 
       } 
 
       void SetData(unsigned int s, double& d) 
 
       { 
 
        arr[s] = d; 
 
       } 
 
     };

wenn ich Kommentar- Dynamic Klasse und DynamicArrayDouble erben sie i Gesicht mit einem gewissen Fehler. Es sollte beachtet werden, dass ich das erste Mal versuche, void * für den zweiten Parameter für Set und Get-Methoden zu verwenden, aber wieder erhalte ich einige Fehler, die ich diesen Code-Stil nicht verwenden kann: Fehler: kann die Variable 'd1' nicht deklarieren sein von abstrakten Typ 'DynamicArrayDouble'

und Code von oben Fehler ist:

class DynamicArray 
 
    { 
 
     public: 
 
      virtual void GetData(unsigned int s, void* d) = 0; 
 
      virtual void SetData(unsigned int s, void* d) = 0; 
 
    }; 
 
    
 
    class DynamicArrayDouble: public DynamicArray 
 
    { 
 
     private: 
 
      unsigned int m_Length; 
 
      double* arr; 
 
     public: 
 
      DynamicArrayDouble(unsigned int l) 
 
      { 
 
       m_Length = l; 
 
       arr = new double[m_Length]; 
 
      } 
 
      void SetParam(unsigned int l) 
 
      { 
 
       m_Length = l; 
 
       arr = new double[m_Length]; 
 
      } 
 
     void GetData(unsigned int s, double* d) 
 
     { 
 
      *d = arr[s]; 
 
     } 
 
     void SetData(unsigned int s, double* d) 
 
     { 
 
      arr[s] = *d; 
 
     } 
 
    }; 
 
    
 
    int main() 
 
    { 
 
     DynamicArrayDouble d1(5); 
 
     double x=0; 
 
    
 
     for(unsigned int i=0;i<5;i++) 
 
     { 
 
      x = ((i+1.0)/2); 
 
      d1.SetData(i,&x); 
 
     } 
 
    
 
     for(unsigned int i=0;i<5;i++) 
 
     { 
 
      d1.GetData(i,&x); 
 
      cout << "Data " << i+1 << " is = " << x << endl; 
 
     } 
 
    
 
     return 0; 
 
    }

ich meine Codes in Codeblöcke schreiben.

Ich werde Ihre Antwort zu schätzen wissen ... Danke.

+1

_I Gesicht einige error_. Und der Fehler ist ..? Da Fehler normalerweise genau angeben, was falsch ist, war es so schwierig, sie zu kopieren oder einzufügen? –

Antwort

0

Sie können einfach nicht

void func(some_pointer_type ptr); 

mit

void func(some_other_pointer_type ptr); 

außer Kraft setzen und gleiche gilt für Referenzen. Diese werden in der Tat als völlig unabhängig betrachtet, wenn sie nicht übereinstimmen.

DynamicArrayDouble - dieser Name sagt mir, dass Sie in Vorlagen suchen sollten und nicht den gleichen Code für alle Typen schreiben müssen, die Sie benötigen. So funktioniert STL. Sie vermeiden den Laufzeitpolymorphismus vollständig.

Für den Anfang:

template <typename T> 
DynamicArray;