2013-04-03 4 views
1

J'ai une classe abstraite censé être une interface, comme ceci:classe abstraite comme argument (cas d'interface)

class IDataSource 
    { 
    public: 
     virtual double getMeThatDouble() = 0; 
    } 

et quelques implémentations comme

class IDataSourceStreamer 
    { 
    public: 
     double getMeThatDouble() 
      { 
      //implementation 
      } 
    } 

Le point est que je veux l'utiliser comme paramètre initial dans le constructeur d'autres classes comme

class DataNeeder 
{ 
    public: 
     explicit DataNeeder(IDataSource); 
} 

et vient ici la peine - "parameter of abstract class type is not allowed". Je comprends que c'est interdit pour une raison particulière - l'utilisation d'une classe abstraite par elle-même est impossible. Donc qu'est ce que je devrais faire? Est-ce qu'une méthode comme

IDataSource.FeedThat(DataNeeder) 

une seule option? Un peu moche.

Répondre

6

Vous devez transmettre le type abstrait en tant que référence ou pointeur. Par exemple:

class DataNeeder { 
public: 
    explicit DataNeeder(IDataSource &source) : source_(source) { 
    } 

    void someMethod() { 
     double x = source_.getMeThatDouble(); 
     // ... 
    } 

private: 
    IDataSource &source_; 
} 

Ensuite, vous pouvez avoir des fonctions de membres de DataNeeder fonctionnent sur source_. Comme je l'ai mentionné, vous pouvez également utiliser un pointeur pour cette tâche, mais j'aime utiliser uniquement les pointeurs pour les paramètres "OUT" et les choses qui peuvent être imaginées NULL.

+0

Cela a très bien fonctionné, merci. –

Questions connexes