C++ 如何从此标头实例化 VkSubProcess 对象

C++ How do I instantiate a VkSubProcess object from this header?

本文关键字:实例化 VkSubProcess 对象 C++      更新时间:2023-10-16

我很难理解如何实例化ViewKit VkSubProcess对象。这个东西的手册页在这里:VkSubProcess.3

我已经阅读了足够多的关于C++来理解这个标头描述了一个引用计数的抽象基类,我想我或多或少地理解了所涉及的概念。然而,我实际使用这个东西的微弱尝试都没有成功。

我的努力导致了各种编译器错误,例如:

"类"RPtr_VkSubProcessRep"没有成员"创建"

或:

"构造函数'VkSubProcessRep::VkSubProcessRep'的实例与参数列表不匹配"

有人可以好心地展示如何从这个标头实例化 VkSubProcess 对象吗?

为简洁起见,我从标题中删除了手册页中提到的函数,这些函数仅在创建实例后才会发挥作用。

非常感谢。

#ifndef _VKPROCESS_H
#define _VKPROCESS_H
#include <signal.h>
#include <Xm/Xm.h>
#include <Vk/VkCallbackObject.h>
#include <Vk/VkBase.h>
#include <Vk/VkApp.h>
class VkSPCounted : public VkCallbackObject {
    friend class VkSPRPtr_base;
    int nreferences;
    void addRef() { nreferences++; }
    void delRef() {
            if (--nreferences <= 0)
              delete this;
    }
    public:
        VkSPCounted() : VkCallbackObject() { nreferences = 0; }
        virtual ~VkSPCounted();
    private:
        VkSPCounted(const VkSPCounted&);
        VkSPCounted &operator= (const VkSPCounted&);
};
class VkSPRPtr_base : public VkBase {
    public:
        operator void*() { return (void *)ptr; }
        VkSPRPtr_base& operator=(VkSPCounted *tp) { 
            if (ptr) ptr->delRef();
            ptr = tp;
            if (ptr) ptr->addRef();
            return *this; 
        }
        VkSPRPtr_base& operator=(const VkSPRPtr_base& r){ 
            if (ptr) ptr->delRef();
            ptr = r.ptr;
            if (ptr) ptr->addRef();
            return *this; 
        }
    protected:
        VkSPCounted *ptr;
        VkSPRPtr_base() : VkBase() { ptr = 0; }
        VkSPRPtr_base(const VkSPRPtr_base& r) : VkBase() {
            ptr = r.ptr;
            if (ptr) ptr->addRef();
        }
        VkSPRPtr_base(VkSPCounted *tp) : VkBase() { 
            ptr = tp;
            if (ptr) ptr->addRef();
        } 
        ~VkSPRPtr_base() { 
            if (ptr) ptr->delRef(); 
        }
};
class VkSubProcessRep;
class RPtr_VkSubProcessRep : public VkSPRPtr_base {
    public: 
        RPtr_VkSubProcessRep(); 
        RPtr_VkSubProcessRep(VkSubProcessRep *tp);  
        RPtr_VkSubProcessRep(const RPtr_VkSubProcessRep& that) : VkSPRPtr_base(that) {} 
        ~RPtr_VkSubProcessRep();    
        RPtr_VkSubProcessRep& operator=(VkSubProcessRep *tp) { 
            *((VkSPRPtr_base *) this) = (VkSPCounted *) tp;     
            return *this; 
        }       
        VkSubProcessRep& operator *();  
        VkSubProcessRep *operator->();  
        int operator !(){ return !ptr; }    
};
typedef RPtr_VkSubProcessRep VkSubProcess;
class VkSubProcessRep : public VkSPCounted {
    public:
        static  VkSubProcess create(char* cmd,
                                    int killChildOnExit,
                                    int redirectIn);
        /* Actually create VkSubProcess */
        void     run();
    protected:
        VkSubProcessRep(const char* prog,
                        char **argv,
                        int killChildOnExit,
                        int redirectIn);
        ~VkSubProcessRep();
    private:
        VkSubProcessRep(const VkSubProcessRep&);
        VkSubProcessRep &operator= (const VkSubProcessRep&);
};
#endif

好吧,在花了一天时间阅读C++之后,我现在知道这个标头描述了引用计数的单例模式。从我所读到的内容来看,静态的"create()"函数和受保护的构造函数似乎是这种模式的典型特征。

你可以这样使用它:

VkSubProcess process = VkSubProcessRep::create("ls -al", 1, 1);
process->run();