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

Member variable of subtype of base class in base class

本文关键字:基类 成员 变量 类型      更新时间:2023-10-16

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

我正在尝试创建两种不同类型的应用程序,一种是从应用程序继承的,另一种是从服务继承的,后者继承自应用程序。所有应用程序都有一个名为 Cron的服务,它将从服务继承。应用程序将被线程化和分离,而从应用程序派生的服务将被线程化和联接。我把它分解为最简单的术语。

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

谢谢

布鲁斯

不,没有办法做你想做的事,因为你想做的是胡说八道。 等等,我会解释的。

Service派生自Application,但Application有一个类型为 Service 的成员。

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

现在的问题是,你到底想做什么?

在你的评论中,你说:

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

这里还是有点模棱两可的地方。 应用程序如何从应用程序派生?

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

在这种情况下:

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

但你也说:

应用程序将是线程化和分离的,而派生的服务 从应用程序将被线程化和连接。

这听起来像是基于策略的设计的工作。

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;
我认为

您真正想做的是使用指针。

class Service;
class Application 
{
     std::shared_ptr<Service> m_service;
};
class Service : public Application
{
};

在我看来,您将接口与实现分离可能会受益:

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() {}
};