Передача дескриптора структуры (преобразование C в C ++ ООП)

0

Можете ли вы предложить способ, как я мог бы передать "handle (* 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();
};

Можете ли вы поделиться некоторыми советами, как я могу это сделать?

Или вопрос в том, правильно ли я делаю это в ООП?

  • 0
    Просто добавьте ini_file_t * в ваш класс XTextFile .
  • 0
    open вероятно, следует сделать конструктором, close() деструктором.
Теги:
oop
handle

4 ответа

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.
}
  • 0
    Спасибо! Я считаю этот ответ наиболее удовлетворительным
0
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",

0

Здесь есть узнаваемый шаблон: ваш h действительно похож на C++ на this указатель. Значит, вы должны отказаться от XTextFile и сделать его XIniFile, причем функции-члены действуют на себя (это ядро ООП).

Затем, чтобы использовать полную мощность C++, реализуйте RAII: ваш файл должен быть открыт в его конструкторе и закрыт в своем деструкторе. Потратьте некоторое время на разработку или удаление своего копировального конструктора, оператора привязки и перемещение копий, если вы используете C++ 11.

0

Поместите 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*

Ещё вопросы

Сообщество Overcoder
Наверх
Меню