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];}

};

如何编写将两个智能数组对象合并为第三个智能数组对象的函数。我无法访问每个智能数组的元素,因为它必须是动态数组。

例如,添加以下成员函数会给我一个错误:

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

1

如何编写将两个智能数组对象合并为第三个智能数组对象的函数。[...]添加以下成员函数给我一个错误。

除非在类定义中内联,否则smartA add(smartA a)应该是smartA smartA::add(smartA const& a). 这是因为否则add将被视为类外的通用函数。add请注意,传递引用而不是副本是有意义的。

operator+此外,在数组的上下文中,重载而不是调用方法是有意义的add。因此,您可能希望在以下位置实现add

friend smartA smartA::operator+(smartA const&, smartA const&);

最后,您的复制构造函数中有一个非常大的问题:

smartA(const smartA &a) {*this=a;}

这可能会导致混叠并导致崩溃或内存问题。你想看看深拷贝三法则

于 2013-04-23T16:07:15.597 回答
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 回答