< P>是私有的。 您应该在virtualvoiddowork()=0;之前指定public:,c++,C++" /> < P>是私有的。 您应该在virtualvoiddowork()=0;之前指定public:,c++,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+中使用抽象类+;用于依赖项注入 参考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

默认情况下,C++继承是私有的(使用
关键字时)。请尝试
:公共IService
,而不是
:IService
。请参阅私有继承、受保护继承和公共继承之间的区别

  • \u service->DoWork();
    的函数体在哪里

  • 默认情况下C++类成员中的LI>< P>是私有的。 您应该在
    virtualvoiddowork()=0;
    之前指定
    public:

  • 默认情况下,C++继承是私有的(使用
    关键字时)。请尝试
    :公共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++的一些快速演示实现,看看我做了什么,真是太可惜了。