具有智能数组对象的类

时间:2013-04-23 15:47:05

标签: c++ arrays class

所以我有以下课程:

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

2 个答案:

答案 0 :(得分: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;}

这可能会导致aliasing并导致崩溃或内存问题。您想要查看深层副本The rule of Three

答案 1 :(得分: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类型转换无缝协作的灵活性,请您添加这些内容)。