所以我有以下课程:
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;}
答案 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
类型转换无缝协作的灵活性,请您添加这些内容)。