0

2 つの 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 をサブクラス化し、operator+ をオーバーロードすることにしました。

これが私のコードです:

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();
}

、結果は正しいですが、これが良いアプローチかどうかはわかりません。より良い解決策があるかどうかを尋ねたいですか?

4

2 に答える 2

0

すでにこの演算子を使用して 2 つのリストを連結している+ため、この演算子をオーバーロードすることはお勧めしません。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値を含むリストに同じ機能が必要な場合)。

于 2012-11-21T16:57:23.093 に答える
0

これは奇妙なアプローチです。明確な名前で別の関数を使用することをお勧めします。QList の operator+ の確立されたセマンティクスを再定義しています。また、コンテナーをサブクラス化することも、あまり良い設計ではありません。コードを見ると、おそらく、リストと数学的ベクトル セマンティクスを混在させないカスタム 3D ベクトル クラスを使用する必要があります。

それとは別に、operator+ の実装には 2 つの問題があります。

  • リスト a1/a2 の要素が 3 つ未満の場合 (重要な、未定義の動作/クラッシュ) を処理せず、インデックス 2 を超えるものは無視します。
  • また、myList に代入すると、まだ空なので、myList[0] などは有効ではありません。最初に myList.resize( 3 ) を実行するか、operator[] の代わりに append()/push_back() を使用する必要があります。
于 2012-11-21T17:03:26.880 に答える