基类中基类子类型的成员变量
Member variable of subtype of base class in base class
有没有办法使用模板执行以下操作? 以下代码引发未知类型的编译时错误。
我正在尝试创建两种不同类型的应用程序,一种是从应用程序继承的,另一种是从服务继承的,后者继承自应用程序。所有应用程序都有一个名为 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() {}
};
相关文章:
- 派生类看不到基类成员
- C++11: 如何访问派生类中的基类成员?
- Qml 未收到基类成员变量的更新值
- 指向从指针派生类成员函数的指针,指向基类成员函数
- 初始化基类成员 (c++) 的首选方法
- 访问多级复合关系中的基类成员
- 允许从特定派生类访问基类成员
- 在派生类的成员联合中包含继承的基类成员
- 由派生类设置的 constexpr 基类成员
- 从派生类调用的抽象基类成员函数
- 从抽象基类访问另一个基类成员
- C++派生类访问基类成员
- 不能引用派生模板类中的基类成员
- C2694 在析构函数上,当基类成员的析构函数具有非空 noexcept 说明符和主体时
- 在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败
- 在C 中访问带有不正确的下属的基类成员
- C++将基类成员链接到派生类成员
- 从基类成员函数返回派生类的实例
- 从指针到基类成员的模板推导
- 是否可以从派生类中排除基类成员?