2014-09-05 6 views
0

Привет всем Я хочу сделать что-то вроде этого:Наследовать от проблем класса шаблон

template<typename T> 
struct APP_Interface{ 
    APP_Interface* shared; 
    Mutex m; 
    T data; 

    virtual void publish(){ 
    //copy data from this->data to shared->data 
    } 

    virtual void receive(){ 
    //copy data from shared->data to this->data 
    } 
}; 

struct MyInterface : APP_Interface<MyInterface>{ 
    float MyData1; 
    float MyData2; 
}; 

Я бегу (не так удивительно, я думаю) в:

error: 'APP_Interface<T>::data' has incomplete type 
error: forward declaration of 'struct MyInterface ' 

Есть ли способ обойти это?

EDIT: То, что я пытаюсь добиться

У меня есть две темы. Thread1 производит данные в реальном времени, и Thread2 потребляет эти данные. Теперь я хочу, чтобы Thread1 делил данные с Thread2 через общие данные и мьютексы.

На самом деле существует много потоков и множество разных интерфейсов данных, разделяющих разные данные. Поэтому я хочу простой и элегантный способ создания и использования интерфейсов.

Я хочу, чтобы создать интерфейс что-то вроде этого:

struct MyInterface : ??? { 
    float MyData1; 
    float MyData2; 
}; 

Тогда, когда я должен использовать его, я просто хочу, чтобы:

//Thread1.hpp 
class thread1{ 
    void run(){ 
     interface.MyData1 = 100; 
     interface.publish(); 
    } 

public: 
    MyInterface interface; 
} 

//And something similar for thread2 at the receiving end 

Наконец я хочу достичь некоторых телицы инъекции зависимостей» «разрешив main.c создать связь между ними и выделить общую структуру. Например, за счет:

//main.cpp 
void main(){ 
    //Bind interfaces: 
    MyInterface interface({ &thread1.interface, //PROVIDER 
          &thread2.interface, //CONSUMER 
          }); 
} 

Я понятия не имею, если это объяснение имеет смысл :)

+0

Это не имеет смысла. Чего вы пытаетесь достичь? Как правило, вы либо хотите, чтобы ваш производный класс был templated, или вы хотите специализировать APP_Interface. Я предполагаю, что вы хотите это: 'struct MyData { float MyData1; float MyData2; }; APP_Interface myDataPublisher; ' – ventsyv

+4

Хорошо, что это не удастся. У вас будет MyInterface, который был App_Interface, который содержал MyInterface, который был App_Interface, который содержал ... Я не думаю, что мы можем ответить, как исправить эту проблему, если вы не сообщите нам, как вы планируете использовать это. Лично я бы опубликовал и получал реферат и делал с ним. – IdeaHat

+0

'T data;' должны быть 'T * данными;' В любом случае посмотрите [** здесь **] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Curiously_Recurring_Template_Pattern), пожалуйста, как создать и используйте 'CRTP' правильно. –

ответ

0
  1. Объявить data быть указателем.
  2. Обеспечьте функции геттера и сеттера. В этих функциях убедитесь, что данные выделены из кучи.

Вот обновленный класс.

template<typename T> 
struct APP_Interface{ 
    APP_Interface* shared; 
    Mutex m; 
    T* data; 

    APP_Interface : data(nullptr) {} 

    T const& getData() const 
    { 
     if (!data) 
     { 
      data = new T; 
     } 
     return *data; 
    } 

    void setData(T const& newData) 
    { 
     if (!data) 
     { 
      data = new T; 
     } 
     *data = newData; 
    } 

    virtual void publish(){ 
    //copy data from this->data to shared->data 
    } 

    virtual void receive(){ 
    //copy data from shared->data to this->data 
    } 
}; 
+0

Я пытаюсь избежать динамического выделения памяти :) – Jolle

+0

В этом случае вам нужно найти другой дизайн для своих классов. Вы не можете использовать шаблон CRTP. –

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