Общий метод между двумя классами - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь разделить метод между двумя классами, где каждый использует свой закрытый атрибут, например:

class DbWriter {
public:
    int GetIdFromDB(QString codVEI)        //<! uses mDbWriteQuery
private:
    QSqlQuery mDbWriteQuery;
}


class DbReader {
public:
    int GetIdFromDB(QString codVEI)        //<! uses mDbReadQuery
private:
    QSqlQuery mDbReadQuery;
}

Я хочу создать что-то вроде метода друга, но с каждымзная свой собственный атрибут-член и не создавая класс и не наследуя от него эти два класса, потому что он не работает в моем случае.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Я бы сделал это с помощью полиморфных классов. Э.Г.

class DbObject
{
public:
  virtual int GetIdFromDB(const QString &codVEI) = 0;
private:
  QSqlQuery mQuery;
};

class DbWriter : public DbObject
{
public:
  int GetIdFromDB(const QString &codVEI) override;
};

class DbReader : public DbObject
{
public:
  int GetIdFromDB(const QString &codVEI) override;
};

Использование:

auto dbObject = std::make_shared<DbWriter>();
int id = dbObject->GetIdFromDB("foo"); // Calls write query

dbObject = std::make_shared<DbReader>();
id = dbObject->GetIdFromDB("foo"); // Calls read query

Обновление

Исправлено объявление класса DbReader - оно также должно быть производным от DbObject class.

0 голосов
/ 25 июня 2018

Если вы хотите поделиться реализацией, просто используйте общую бесплатную функцию:

namespace detail {
  int GetIdFromDB(QString codVEI, QSqlQuery const& query); 
}

Включите / свяжите ее с обоими классами и попросите их вызвать ее.

Передача запроса какПараметр позволяет избежать бессмысленной связи, не добавляя дружбу в смесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...