0

だから私は次のクラスを持っています:

class smartA
{
public:

int *p;
int size;

smartA(){size=10; p = new int [size];}
smartA (int x){size=x; p = new int [x];}
smartA(int y[], int x ){size=x; p = new int [x]; for (int i=0 ; i<x ; i++) p[i]=y[i];}
smartA(const smartA &a) {*this=a;}
~smartA(){delete [] p;}

void displayA()
{
for (int i=0; i<size; i++)
{   cout<<setw(4)<<p[i];
if (((i+1)%5)==0 && i!=0)
cout<<endl;}
    cout<<endl<<endl;
}

void setsmartA(const int a[], int sizea) 
{size=sizea; p = new int[size]; for (int i=0 ; i<size ; i++) p[i]=a[i];}

};

2 つのスマート配列オブジェクトを 3 つ目のスマート配列オブジェクトにマージする関数を作成するにはどうすればよいですか? 動的配列でなければならないため、各スマート配列の要素にアクセスするのに問題があります。

たとえば、次のメンバー関数を追加するとエラーが発生します。

smartA add(smartA a)
{
smartA c(a.size+size);

int i=0;
for ( ; i<a.size ;i++)
c.p[i]=a.p[i];

for (int j=0; j<a.size+size; j++, i++)
c.p[i]=p[j];

return c;}
4

2 に答える 2

0

関数への参照によってパラメーターを渡しますfriend。値で返します。

class smartA
{
  int *p;
  int size;

public:
....
  friend smartA operator+ (const SmartA& sa1, const SmartA& sa2);
};

smartA operator+ (const SmartA& sa1, const SmartA& sa2)
{
  SmartA res(sa1.size + sa2.size);

  for(int i = 0; i < sa1.size; i++)
    res.p[i] = sa1.p[i];

  for(int i = sa1.size, j = 0; i < sa1.size + sa2.size; i++, j++)
    res.p[i] = sa2.p[j];

  return res;
}

コード スニペットとは異なり、メンバーを非公開にしました。情報をカプセル化することから始めて、必要に応じて公開するのが常に最善です。その逆ではありません。

operator+また、関数を、またはその友人にする必要はありません。私はそれが提供する対称性のためにそれが好きです. (そして、 への型変換をシームレスに行う演算子の柔軟性は、smartAそれらを追加する必要があります)。

于 2013-04-23T15:54:38.897 に答える