如何访问类的指针成员

时间:2013-08-29 15:35:28

标签: c++

嗨我需要访问我的类中的指针成员,用于重载赋值运算符。 我的代码如下?请告诉我我做错了什么..谢谢 它是一个实现复制构造函数的简单程序,重载赋值运算符,析构函数

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

2 个答案:

答案 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[]

还有一些最后的话:智能指针!