基类中基类子类的成员变量

时间:2014-07-18 19:28:47

标签: c++ c++11

有没有办法用模板执行以下操作?以下代码抛出未知类型的编译时错误。

我正在尝试创建两种不同类型的Application,即从Application继承的Application,以及从Application继承的Service继承的类型。所有应用程序都有一个名为Cron的服务,它将从服务继承。应用程序将进行线程化和分离,而从Application派生的服务将进行线程化和连接。我把它简化为最简单的术语。

#include <iostream>

class Application
{
public:
Service service; //Throws unknown type... Forward decl. will not work either.

};


class Service:public Application
{


};

int main(int argc, const char * argv[])
{

// insert code here...
std::cout << "Hello, World!\n";
return 0;
}

谢谢,

布鲁斯

3 个答案:

答案 0 :(得分:5)

不,没有办法做你想做的事,因为你想做的是废话。坚持,我会解释。

Service源自Application,但Application的成员类型为Service

这是一种循环依赖,但除此之外,我只是不理解它。由于Service派生自Application,其成员类型为Service,派生自Application,其成员类型为Service。你明白了。就像站在带镜子的镜子前,试图找到尽头。

现在问题变成了,你真正试图做什么?

在你的评论中,你说:

  

我正在尝试创建两种不同类型的应用程序   继承自Application,以及继承自Service的那些   继承自Application。所有应用程序都有一个名为的服   Cron,将继承服务。

这里仍有一点含糊之处。 Application如何从Application获得?

我怀疑你所拥有的是具有实现Service的类的两个不同的具体实例。一个只实现Service,另一个实现其他东西。

在那种情况下:

class Service
{
public:
  void Cron();
};

class Application
{
public:
  void OtherStuff();
};

但你也说过:

  

应用程序将进行线程化和分离,同时派生的服务   来自应用程序将进行线程化和连接。

这听起来像是policy-based design的工作。

class DetatchedPolicy
{
public:
  void StartThread();  // this function would start the thread and detatch
};

class JoinedPolicy
{
public:
  void StartThread();  // this function would start the thread and join
};

template <typename ThreadingPolicy>
class BasicService
:
  public ThreadingPolicy
{
public:
  Service()
  {
    StartThread();
  }
  void Cron();
};

typedef BasicService <JoinedPolicy> Service;
typedef BasicService <DetatchedPolicy> Application;

答案 1 :(得分:0)

我认为你真正想做的是使用指针。

class Service;
class Application 
{

     std::shared_ptr<Service> m_service;
};

class Service : public Application
{
};

答案 2 :(得分:0)

听起来,您可能会从界面与实现分离中受益:

struct ApplicationInterface
{
    virtual ~ApplicationInterface() {}

    virtual void do_application_stuff_1() = 0;
    virtual void do_application_stuff_2() = 0;
};

struct ServiceInterface
: public ApplicationInterface
{
    virtual ~ServiceInterface() {}

    virtual void do_service_stuff_1() = 0;
    virtual void do_service_stuff_2() = 0;
};

class CronService
: ServiceInterface
{
public:
    // ApplicationInterface
    virtual void do_application_stuff_1() {}
    virtual void do_application_stuff_2() {}

    // ServiceInterface
    virtual void do_service_stuff_1() {}
    virtual void do_service_stuff_2() {}
};

class Application
: ApplicationInterface
{
protected:
    CronService cron;

public:

    virtual void do_application_stuff_1() {}
    virtual void do_application_stuff_2() {}
};