嗨我需要访问我的类中的指针成员,用于重载赋值运算符。 我的代码如下?请告诉我我做错了什么..谢谢 它是一个实现复制构造函数的简单程序,重载赋值运算符,析构函数
#include<iostream>
class A
{
private:
int a;
char *ctr;
int *itr;
public:
A()
{
a=10;
ctr=new char[10];
itr=NULL;
cout<<"Inside default constructor"<<endl;
}
A(const A &b)
{
a=b.a;
ctr= newchar[10];
itr=new int;
*itr=b.*itr;
*ctr=b.*ctr;
cout<<"inside copy constructor"<<endl;
}
A operator=(const A a)
{
A b;
b.a=a.a;
b.*itr=a.*itr;
b.*ctr=a.*ctr;
cout<<"Overloaded assignment operator"<<endl;
return b;
}
~A()
{
delete(itr);
delete(ctr);
cout<<"destructor"<<endl;
}
};
int main()
{
A a1 ,a2;
a1.*ctr="GOVIND";
a2.*ctr="SINGH";
a1.*itr=35;
a2.*itr=99;
A a3=a2;
cout<<"Class template program"<<endl;
cout<<a1.a<<" ",,a1.*ctr<<" "<<a1.*itr<<endl;
cout<<a2.a<<" ",,a2.*ctr<<" "<<a2.*itr<<endl;
cout<<a3.a<<" ",,a3.*ctr<<" "<<a3.*itr<<endl;
return 0;
}
答案 0 :(得分:4)
b.*itr=a.*itr;
b.*ctr=a.*ctr;
应该是
*b.itr=*a.itr;
*b.ctr=*a.ctr;
此外,运营商不应该返回对this
的引用吗?
A& operator=(const A a)
{
this->a = a.a;
*itr = *a.itr;
*ctr = *a.ctr;
return *this;
}
答案 1 :(得分:1)
太错了,我甚至在哪里开始?
首先,聪明的指针,伙计!智能指针!
A(const A &b)
{
a=b.a;
ctr= newchar[10];
itr=new int;
*itr=b.*itr;
指定值的正确语法是
*itr = *b.itr;
如果你想复制指针,那也看起来不一样,但是你分享指针并遇到麻烦,所以不要这样做。
无论如何,这仍然是错误的,因为b.itr可能为null(您的默认构造函数使其为null)。所以弄清楚你真正想要的是什么。它应该永远不会是空的吗?在构造函数中分配一些东西。它可能是null吗?然后在复制构造函数中尊重这种可能性。
*ctr=b.*ctr;
错误的语法,但即使你纠正它,它仍然是错误的:它只复制数组中的第一个字符。你为什么还有这个数组呢?这是固定的大小。你想要一个简单的固定阵列吗?你想要一个字符串吗?
cout<<"inside copy constructor"<<endl;
}
A operator=(const A a)
你的意思是a
作为参考吗? const值不是传递给赋值运算符的好东西。如果你正确地实现了赋值,那么非const值可能是一个好主意。
{
A b;
这b
应该是什么?你不想使用当前对象吗?
b.a=a.a;
应为a = a.a;
b.*itr=a.*itr;
与复制构造函数一样,只有更糟糕的是:如果已经分配了itr,则泄漏旧内存。
b.*ctr=a.*ctr;
如上所述,同样的新问题。
cout<<"Overloaded assignment operator"<<endl;
return b;
复制作业应返回*this
。你正在创建一个悬空参考。你还明显没有把你的编译器警告调高到足够高(或者你忽略了它们),如果它没有为此尖叫你。
}
~A()
{
delete(itr);
请勿在{{1}}上使用括号。好吧,你可以,但这是不寻常的,也是误导性的。 delete
不是函数。
delete
delete(ctr);
已分配ctr
,您必须使用new[]
释放其内存。
delete[]
还有一些最后的话:智能指针!