2013-04-03 20 views
1

У меня есть абстрактный класс должен быть интерфейс, как это:Абстрактный класс в качестве аргумента (интерфейс случае)

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

и некоторые реализации, как

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

Дело в том, что я хочу использовать его в качестве исходного параметра в конструктор других классов, как

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

и здесь приходит беда - "parameter of abstract class type is not allowed".

Я понимаю, что это запрещено по определенной причине - использование абстрактного класса само по себе невозможно. И что же мне делать? Является ли такой способ, как

IDataSource.FeedThat(DataNeeder) 

a единственный вариант? Природный урод.

ответ

6

Вам необходимо передать абстрактный тип как ссылку или указатель. Например:

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

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

private: 
    IDataSource &source_; 
} 

Тогда вы можете иметь DataNeeder функции УЧАСТНИКА работают на source_. Как я уже упоминал, вы также можете использовать указатель для этой задачи, но мне нравится использовать указатели только для параметров «OUT» и вещей, которые могут мыслиться NULL.

+0

Это сработало просто отлично, спасибо. –

Смежные вопросы