继承模板类问题

时间:2014-09-05 18:23:23

标签: c++ templates inheritance

大家好我想做这样的事情:

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 '

有什么方法吗?

编辑:我想要实现的目标

我有两个主题。 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

最后,我想要实现一些依赖注入&#34;通过让main.c创建两者之间的链接并分配共享结构。例如:

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

我不知道这个解释是否有意义:)

1 个答案:

答案 0 :(得分:0)

  1. 声明data为指针。
  2. 提供getter和setter函数。在这些函数中,确保从堆中分配数据。
  3. 这是更新的课程。

    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 
        }
    };