【问题标题】:Passing a structure handle (converting C to C++ OOP)传递结构句柄(将 C 转换为 C++ OOP)
【发布时间】:2014-07-25 07:54:15
【问题描述】:

您能否建议一种方法,如何在对象内部传递“句柄 (*h)”?这就是我的代码在 C 中的样子。

int open(const char *name, ini_file_t **);
int read(ini_file_t *h, const char *sn, const char *kn, int *);
int write(ini_file_t *h, char *sn, char *kn, int);
int ini_file_close(ini_file_t *h);

我试图在 C++ 中消除 (*h)。

XTextFile {
public:
int open(const char *name);
int read(const char *sn, const char *kn, int *);
int write(char *sn, char *kn, int);
int ini_file_close();
};

您能分享一些我如何做到这一点的提示吗?

或者问题是我在 OOP 中这样做是否正确?

【问题讨论】:

  • 只需将ini_file_t * 属性添加到您的XTextFile 类。
  • open 应该是构造函数,close() 是析构函数。

标签: c++ oop handle


【解决方案1】:

这是我的解释:

class XTextFile
{
    public:
    XTextFile(const std::string& name);// constructor replaces open()
    ~XTextFile();// destructor replaces ini_file_close
    int read(const std::string& sn, const std::string& kn, int *);
    int write(char *sn, char *kn, int);// not sure what these params are but they should also probably be some form of std::string
};

C++ 构造函数用于初始化对象,而析构函数在其空闲时清理其资源。你可以像这样使用这个对象:

void someFunction()
{
    XTextFile txt("c:\\filename.txt");
    txt.read(....);
    // txt is automatically closed when it goes out of scope.
}

【讨论】:

  • 谢谢!我觉得这是最令人满意的答案
【解决方案2】:
XTextFile {
public:
    int open(const char *name);
    int read(const char *sn, const char *kn, int *);
    int write(char *sn, char *kn, int);
    int ini_file_close();
private:
    ini_file_h * m_handle;
};

当然,您需要提供适当的构造函数来将成员初始化为“nullptr”之类的东西

【讨论】:

    【解决方案3】:

    这里有一个可识别的模式:您的 h 与 C++ 的 this 指针非常相似。意思是,你应该放弃 XTextFile 并改成 XIniFile,让成员函数作用于自身(这是 OOP 的核心)。

    然后,要使用 C++ 的全部功能,请实现 RAII:您的文件应该在其构造函数中打开,并在其析构函数中关闭。如果您使用 C++11,请花一些时间来设计或删除您的复制构造函数、赋值运算符和移动对应项。

    【讨论】:

      【解决方案4】:

      ini_file_t 作为私有成员变量。

      你可以用构造函数替换 open() 函数。这样:

      XTextFile {
      private:
         ini_file_t* m_h; 
      public:
         XTextFile(const char *name);
         ~XTextFile();
         int read(const char *sn, const char *kn, int *);
         int write(char *sn, char *kn, int);
         int ini_file_close();
      };
      

      构造函数初始化 m_h 属性。 您也可以使用 c++ 的东西(std::string、std:vector 等)而不是 char*

      【讨论】:

        猜你喜欢
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        • 2013-07-31
        • 2016-09-10
        相关资源
        最近更新 更多