Class A
{
我的代码如下:
public:
CStringArray aStr;
};Class B
{
CArray<A,A&> Array;
};B b;
b.aStr.Add("aaaa");
//上面的代码编译会出现如下错误:
error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'.
请问如何解决?

解决方案 »

  1.   

    你贴的代码跟这个错误好象没什么关系吧?
    这个错误是因为CObject不允许拷贝构造,把相关参数改成传递引用就可以了。
      

  2.   

    要实现楼主的功能至少应该如以下代码:
    class A 
    {  
    public: 
        CStringArray aStr;   //这个相当与一个数组

        A( )     //必须有构造函数,才能声明A类的对象
        {
        }

    //    A( A &other)   
    //    {   
    //        *this = other;   
    //    }   
        
        A & operator = (A & other) //必须重载“=”号运算符,A类变量才能被压入B类定义的CArray < A, A& > Array;类型中去。
        {                          //否则提示无“=”运算符操作。
             aStr.RemoveAll();      //首先清空自身的数组

            for( int i=0;i<other.aStr.GetSize(); i++ ) //循环加入对方的各个值
            {
                aStr.Add(other.aStr[i]);
            }
           return   *this;
        } 
        ~A()  //这里最好添加一个析构函数,不然容易造成内存泄露 
               //析构的作用就是把CStringArray aStr占用的内存清除,防止内存泄露。
        {
            INT br=0;
            while( br< aStr.GetSize())
            {
                aStr.RemoveAt(br);
            }
            aStr.RemoveAll();
        }
    }; class B 

    public:
        CArray < A, A& > Array;    //你这里声明了一个A类数组,但是CArray类型要求,A类必须有等号运算符重载才能加进去。
        B( )   //B类也必须有构造函数才能声明变量  //这里在B类构造的时候就给Array变量添加了一个A类对象
        {
            A a;
            a.aStr.Add( "ni hao a" );
            Array.Add( a );
        }
        ~B() //同样,这里最好添加一个析构函数,不然容易造成内存泄露
        {
            INT br=0;
            while( br< Array.GetSize())
            {
                Array.RemoveAt(br);
            }

            Array.RemoveAll();
        }
    }; B b; 
    b.Array[0].aStr.Add("aaaa");  
    //这句话的含义是B类中 A类数组Array中 第一个A类变量Array[0]中 CString类型数组变量aStr 增加一个新的CString —— "aaaa"。
    你的这个东东嵌套了很多层,主要是CArray类型的问题:
    1.CStringArray类型跟你声明:CArray < CString, CString& > CStringArray; 区别不大,别因为它的名字就认为它是一个向int一样的类型了。
    2.如果要想自己定义类的也能使用到CArray类型中,那么你自己定义的类要支持"="运算符
    3.形如CArray < A, A& > Array;这样定义的变量不能直接用等号赋值:
    也就是说:
    CArray < A, A& > Array;
    CArray < A, A& > Mrray;
    Array = Mrray; //这样是不成立的,必须使用循环方式来赋值(查看=号运算符内部代码)
    4.使用CArray类型,必须自己手动写代码做好内存清理,不然容易造成内存泄露
    5.形如CArray < A, A& > Array;这样定义的变量,可以使用“[ ]”来操作单个元素。
    Array[4]Array.GetAt(4)是一样的。
    其他关于CArray的操作等楼主请自己查找MSDN或Google。
      

  3.   

    更正,我的代码是用struct实现的,修改后的代码如下,但还是出现那个error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'. 错误struct A
    {
    我的代码如下:
    CStringArray aStr;
     A & operator = (A & other) //必须重载“=”号运算符,A类变量才能被压入B类定义的CArray < A, A& > Array;类型中去。
        {                          //否则提示无“=”运算符操作。
             aStr.RemoveAll();      //首先清空自身的数组
            
            for( int i=0;i<other.aStr.GetSize(); i++ ) //循环加入对方的各个值
            {
                aStr.Add(other.aStr[i]);
            }
           return   *this;
        } };struct B
    {
    CArray <A,A&> Array;
    };B b;
    b.aStr.Add("aaaa");
    //上面的代码编译会出现如下错误:
    error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'. 
      

  4.   


    struct B 

    CArray <A,A&> Array; 
    }; B b; 
    b.aStr.Add("aaaa"); struct B中放的一个关于struct A对象的数组,那么b.aStr访问的哪个A对象的aStr呢?这边设计有问题
      

  5.   

    CArray <A,A&> Array; 
     
    C++中如果不指定访问属性默认是私有的,显示改为public
      

  6.   

    你的问题不是你贴的代码中出现的吧? 有关系吗?错误本身是是因为你使用了Operator=但并不允许,但代码中未见