1

次のように単純に記述して、2 つの配列を追加します。

int a[4] = {1,2,3,4};
int b[4] = {2,1,3,1};
int sum[4] = a + b;

この関数を書きましたが、エラーが発生しました

int* operator+(const uint32& other) const{
    uint32 sum[n];
    for(int i=0; i<n; i++){
        sum[i] = (*this[i]) + other[i];
    }
    return sum;
}

これについて私を助けてもらえますか?前もって感謝します。

4

7 に答える 7

11

コードを1つずつ見ていき、問題を見てみましょう。

int* operator+(const uint32& other) const{
  1. 組み込み型の演算子をオーバーロードできないため、これは最初から運命づけられています
  2. これができたとしても(できません)、非メンバーのバイナリ関数であるため、2つのパラメーターを受け取る必要があります。
    uint32 sum[n];
  1. C ++で可変長配列を作成することはできません(nコンパイル時定数ではないと仮定します)(注:G ++にはこれを可能にする拡張機能がいくつかありますが、非標準のC ++です)
    for(int i=0; i<n; i++){
        sum[i] = (*this[i]) + other[i];
  1. このコードには最初のthisポインタはありません(メンバー関数ではありません)...
  2. const uint32& other配列/配列へのポインタではありません。これは、単一のへの単一の参照uint32です。つまりother、このコードでは配列/配列へのポインタではないother[i]ため、実行できません(実行しようとしているようなものint x = 3; x[4] = 13;で、意味がありません)。
    }
    return sum;
  1. sumローカルに割り当てられた配列へのポインタを返します。これは、この関数が戻ると、に関連付けられたメモリが消滅するため、未定義の動作が発生することを意味します。
}
于 2013-02-25T05:14:22.877 に答える
3

これはおそらく間違っていますが、動作しているようです (C++11):

#include <iostream>
#include <array>

using namespace std;

template <class T>
T operator+(const T& a1, const T& a2)
{
  T a;
  for (typename T::size_type i = 0; i < a1.size(); i++)
    a[i] = a1[i] + a2[i];
  return a;
}

int main()
{
  array<int,5> a1 = { 1, 2, 3, 4, 5 };
  array<int,5> a2 = { 2, 3, 4, 5, 6 };
  array<int,5> a3 = a1 + a2;

  for (int i = 0; i < 5; i++)
    cout << a1[i] << '+' << a2[i] << '=' << a3[i] << ' ';

  cout << endl;
  return 0;
}

出力 ( ideone ):

1+2=3 2+3=5 3+4=7 4+5=9 5+6=11 
于 2013-02-25T05:58:33.377 に答える
2

それをしてはいけない。非メンバーの二項演算子は2つの引数を取る必要があるため(1つだけ指定した)、これを試すことができます。

int* operator+(const uint32& a, const uint32& b)

uint32ただし、単一の変数ではなく配列を追加する必要があるため、これも機能しない可能性があります。だからあなたはこれがそれをするだろうと思うでしょう:

int* operator+(const uint32[] a, const uint32[] b)

また:

int* operator+(const uint32[4] a, const uint32[4] b)

しかし、行きません。演算子のオーバーロードで両方の引数としてポインタ型を持つことはできないため、これは違法です。さらに、引数の少なくとも1つはクラスタイプまたは。である必要がありますenum。したがって、あなたがやろうとしていることは、少なくとも2つの異なるレベルではすでに不可能です。

あなたがやりたいことをするのは不可能です。それを実行する正しい方法の1つは、別の配列に追加できる配列の独自のクラスを作成することです。

于 2013-02-25T05:13:54.297 に答える
2

問題は、配列の長さを渡す方法が不足していることだと思います。もう少し洗練された操作が必要になる場合があります。何かのようなもの:

class AddingVector : public std::vector<int>
{
    public:
    typedef AddingVector type;
    type operator+(const AddingVector& rhs, const AddingVector& lhs)
    {
       /* validate that they're the same size, decide how you want to handle that*/
       AddingVector retVal;
       AddingVector::const_iterator rIter = rhs.begin();
       AddingVector::const_iterator lIter = lhs.begin();
       while (rIter != rhs.end() && lIter != lhs.end()) {
         retVal.push_back(*rIter + *lIter);
         ++rIter;
         ++lIter;
       }
       return retVal;
     }
}
于 2013-02-25T05:09:22.140 に答える
1

まず、コードが適切にコンパイルされ、配列の宣言で「n」を直接使用し、「n」が定数として宣言されます。さらに、関数でローカル変数を取得して返します。これにより、ガベージフォームが返されます。スタック、私が提案できるのは、メモリをmallocして使用することですが、再度解放する必要があります...

ねえ、あなたができることは、

ラッパークラス「配列」を取得します

class array
{
   int *ipArr;
   DWORD size;
};

次に、コンストラクターで、配列にしたいサイズを渡すことができます。

array(DWORD dwSize);
{
  // then malloc memory of size dwSize;
}

このクラスにはオーバーロードされた演算子「+」があります。これには、2つのint配列を追加する上記の実装があります。ここで、「=」代入演算子もオーバーロードする必要があることに注意してください。これにより、配列クラスを直接実行できるようになります。デストラクタで関連するメモリを解放できます

于 2013-02-25T05:14:06.727 に答える
1

独自に定義した型以外の型の演算子をオーバーロードすることはできません。つまり、クラスXを作成する場合、Xの演算子をオーバーロードすることはできますが、配列または基本型へのポインターの演算子をオーバーロードすることはできません。

于 2013-02-25T05:14:27.763 に答える
0

いくつか問題があります。1 つ目は、両方の配列を渡していないこと、次に n を指定していないこと、そして最後に、ローカル変数へのポインターを渡そうとしていることです。クラスのメンバ オペレータを作成しようとしているようです。

したがって、基本的に、指定されていない長さの配列の内容を同じ長さの初期化されていない配列に追加し、スタックメモリを返そうとしています。

したがって、配列へのポインターと配列の長さと出力配列を渡すと機能しますが、構文はありません

sum = a + b; 

それは次のようなものになります

addArray(&a, &b, &sum, 4);

必要な構文を取得するには、配列をラップするクラスを作成できます。しかし、それははるかに複雑な作業です。

于 2013-02-25T05:20:20.163 に答える