создание подклассов QList и оператор + перегрузка

Я хотел бы иметь возможность добавить два объекта QList. Например:

QList<int> b;
b.append(10);
b.append(20);
b.append(30);

QList<int> c;
c.append(1);
c.append(2);
c.append(3);

QList<int> d;
d = b + c;

По этой причине я решил создать подкласс QList и перегрузить оператор +.

Вот мой код:

class List : public QList<int>
{
public:
List() : QList<int>() {}

// Add QList + QList
friend List operator+(const List& a1, const List& a2);
};

List operator+(const List& a1, const List& a2)
{
List myList;

myList.append(a1[0] + a2[0]);
myList.append(a1[1] + a2[1]);
myList.append(a1[2] + a2[2]);

return myList;
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

List b;
b.append(10);
b.append(20);
b.append(30);

List c;
c.append(1);
c.append(2);
c.append(3);

List d;
d = b + c;

List::iterator i;
for(i = d.begin(); i != d.end(); ++i)
qDebug() << *i;

return a.exec();
}

, результат верный, но я не уверен, что это хороший подход. Я хотел бы спросить, есть ли лучшее решение?

0

Решение

Это странный подход. Лучше использовать отдельную функцию с понятным именем. Вы переопределяете установленную семантику operator + для QList, и контейнеры с подклассами тоже не очень хороший дизайн.
Глядя на свой код, вы, вероятно, захотите использовать собственный векторный класс 3D, который не смешивает список с математической векторной семантикой.

Кроме того, у вашего оператора + реализация есть две проблемы:

  • Вы не обрабатываете случай, когда списки a1 / a2 имеют менее трех элементов (критическое, неопределенное поведение / сбой), и игнорируете все, что находится за пределами индекса 2.
  • Кроме того, когда вы присваиваете myList, он все еще пуст, поэтому myList [0] и т. Д. Недопустим.
    Сначала вам нужно myList.resize (3) или использовать append () / push_back () вместо operator [].
0

Другие решения

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

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

В этом случае более подходящим может быть функция, не являющаяся членом, не являющаяся другом, которая вмещает списки любого размера:

QList<int> addListValuesTogether(const QList<int>& a1, const QList<int>& a2)
{
QList<int> resultingList;
Q_ASSERT(a1.size() == a2.size());

for (int i=0; i<a1.size(); i++)
{
resultingList.append(a1[i] + a2[i]);
}

return resultingList;
}

Вы можете пойти дальше и сделать вышеупомянутую функцию универсальной (если, например, вам нужна та же функциональность для списков, содержащих double ценности).

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector