有没有办法用模板执行以下操作?以下代码抛出未知类型的编译时错误。
我正在尝试创建两种不同类型的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;
}
谢谢,
布鲁斯
答案 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() {}
};