在C+中使用抽象类+;用于依赖项注入 参考StAdppOver问题,我无法理解在C++风格中使用接口实现DI的相同问题,即抽象类。我创造了这条线,而不是用旧线。编译器为最后一行抛出错误 class IService { virtual void DoWork() = 0; virtual bool IsRunning() = 0; }; class ClientA : IService { void DoWork() { std::cout << "Work in progress inside A"; } bool IsRunning() { return true; } }; class ClientB : IService { void DoWork() { std::cout << "Work in progress inside B"; } bool IsRunning() { return true; } }; class Server { IService* _service; Server(IService* service) : _service(service) { } // Error: this declaration has no storage class or type specifier // Compiler: MSVC 2017 _service->DoWork(); }; class设备{ 虚空DoWork()=0; 虚拟bool IsRunning()=0; }; 客户类别:IService{ 无效销钉(){ 标准::cout 默认情况下C++类成员中的LI>< P>是私有的。 您应该在virtualvoiddowork()=0;之前指定public:
默认情况下,C++继承是私有的(使用在C+中使用抽象类+;用于依赖项注入 参考StAdppOver问题,我无法理解在C++风格中使用接口实现DI的相同问题,即抽象类。我创造了这条线,而不是用旧线。编译器为最后一行抛出错误 class IService { virtual void DoWork() = 0; virtual bool IsRunning() = 0; }; class ClientA : IService { void DoWork() { std::cout << "Work in progress inside A"; } bool IsRunning() { return true; } }; class ClientB : IService { void DoWork() { std::cout << "Work in progress inside B"; } bool IsRunning() { return true; } }; class Server { IService* _service; Server(IService* service) : _service(service) { } // Error: this declaration has no storage class or type specifier // Compiler: MSVC 2017 _service->DoWork(); }; class设备{ 虚空DoWork()=0; 虚拟bool IsRunning()=0; }; 客户类别:IService{ 无效销钉(){ 标准::cout 默认情况下C++类成员中的LI>< P>是私有的。 您应该在virtualvoiddowork()=0;之前指定public:,c++,C++,默认情况下,C++继承是私有的(使用类关键字时)。请尝试:公共IService,而不是:IService。请参阅私有继承、受保护继承和公共继承之间的区别 \u service->DoWork();的函数体在哪里 默认情况下C++类成员中的LI>< P>是私有的。 您应该在virtualvoiddowork()=0;之前指定public: 默认情况下,C++继承是私有的(使用类关键字时)。请尝试:公共IService,而不是:IService。请参阅私有继承、受保护继承和公共继承之间的区别 \u
类
关键字时)。请尝试:公共IService
,而不是:IService
。请参阅私有继承、受保护继承和公共继承之间的区别
\u service->DoWork();
的函数体在哪里virtualvoiddowork()=0;
之前指定public:
类
关键字时)。请尝试:公共IService
,而不是:IService
。请参阅私有继承、受保护继承和公共继承之间的区别\u service->DoWork();
的函数体在哪里我相信这就是你想要的:
#include <iostream>
using namespace std;
struct IService {
virtual ~IService() = default; // Remember about virtual dtor to avoid memory leaks!
virtual void DoWork() = 0;
virtual bool IsRunning() = 0;
};
class ClientA : public IService {
void DoWork() {
std::cout << "Work in progress inside A" << endl;
}
bool IsRunning() {
return true;
}
};
class ClientB : public IService {
void DoWork() {
std::cout << "Work in progress inside B" << endl;
}
bool IsRunning() {
return true;
}
};
class Server {
IService* _service;
public:
Server(IService* service) : _service(service)
{ }
void doStuff() {
_service->DoWork();
}
};
int main() {
ClientA a;
ClientB b;
Server sa(&a), sb(&b);
cout << "ServerA: " << endl;
sa.doStuff();
cout << "ServerB: " << endl;
sb.doStuff();
return 0;
}
#包括
使用名称空间std;
结构设备{
virtual~IService()=default;//记住虚拟dtor以避免内存泄漏!
虚空DoWork()=0;
虚拟bool IsRunning()=0;
};
客户类别A:公共设施{
无效销钉(){
我相信这就是你想要的:
#include <iostream>
using namespace std;
struct IService {
virtual ~IService() = default; // Remember about virtual dtor to avoid memory leaks!
virtual void DoWork() = 0;
virtual bool IsRunning() = 0;
};
class ClientA : public IService {
void DoWork() {
std::cout << "Work in progress inside A" << endl;
}
bool IsRunning() {
return true;
}
};
class ClientB : public IService {
void DoWork() {
std::cout << "Work in progress inside B" << endl;
}
bool IsRunning() {
return true;
}
};
class Server {
IService* _service;
public:
Server(IService* service) : _service(service)
{ }
void doStuff() {
_service->DoWork();
}
};
int main() {
ClientA a;
ClientB b;
Server sa(&a), sb(&b);
cout << "ServerA: " << endl;
sa.doStuff();
cout << "ServerB: " << endl;
sb.doStuff();
return 0;
}
#包括
使用名称空间std;
结构设备{
virtual~IService()=default;//记住虚拟dtor以避免内存泄漏!
虚空DoWork()=0;
虚拟bool IsRunning()=0;
};
客户类别A:公共设施{
无效销钉(){
STD:C++中的CUT,代码>类<代码>是一个(组合的)数据类型的定义(类似于结构> /CODE >。它可能不包含语句。语句只能用于函数(包括成员函数)。<代码>是一个类内的语句,但在任何函数之外。在C++中,无论您的类是否抽象,都不能这样做。为了将来的引用,我们不必碰到旧的Q/A栈溢出问题。OTHH,您的问题与其他问题不同,因此,请将此作为单独的问题来询问,这是正确的。在C++中,<代码>类< /COD>是一个(组合的)数据类型的定义(类似于结构> /CODE >。它可能不包含语句。语句只能在函数中使用(包括成员函数)。<代码>是一个类内的语句,但在任何函数之外。在C++中,无论您的类是否抽象,都不能这样做。为了将来的引用,我们不必碰到旧的Q/A栈溢出问题。OTHH,您的问题与其他问题不同,因此,请将此作为单独的问题来询问,这是正确的。ng与抽象类或依赖项注入有关。(1)没有必要这样做。非虚拟接口函数通常会调用私有虚拟函数,但它们仍然可以被重写。(2)仅当使用class关键字时。@StoryTeller对(2)有很好的理解。至于(1)我认为他希望局外人能够调用<代码> ISService 中的每个函数。我认为这里需要<代码>公共>代码>?我是错的?哦,你的意思是让ISIVIECE功能公开。是的,我同意。大脑呃逆,抱歉。RayMi97!神圣的狗屎!我错过了C++的功能和基础。这真是一个愚蠢的错误。对于这种类型的问题,我真的很抱歉。在进一步发布之前,我肯定会仔细检查所有代码。最后,非常感谢。(1)没有必要这样做。非虚拟接口函数通常会调用私有虚拟函数,它们仍然可以被重写。(2)仅当使用class关键字时。@StoryTeller很好地抓住了(2)。至于(1)我认为他希望局外人能够调用<代码> ISService 中的每个函数。我认为这里需要<代码>公共>代码>?我是错的?哦,你的意思是让ISIVIECE功能公开。是的,我同意。大脑呃逆,抱歉。RayMi97!神圣的狗屎!我错过了C++的功能和基础。这真是一个愚蠢的错误。真的很抱歉,我会在再发帖之前仔细检查任何代码。最后一个巨大的感谢。我错过了一个最糟糕的功能之一,我错过了C++的功能和基本知识。这对我来说是一个很好的学习,我是如何做这个愚蠢的错误的。谢谢你的支持和快速支持。这几天我在犹豫。循环C++概念,然后回到C++中进行一些快速演示,看看我做了什么。这是一个耻辱。这是我最糟糕的一个,我错过了C++的功能和基础。这对我来说是一个很好的学习,我是如何做这个愚蠢的错误的。谢谢你的支持和快速支持。这几天我在C概念和BBA徘徊。CK到C++的一些快速演示实现,看看我做了什么,真是太可惜了。