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'.
请问如何解决?
{
我的代码如下:
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'.
请问如何解决?
这个错误是因为CObject不允许拷贝构造,把相关参数改成传递引用就可以了。
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。
{
我的代码如下:
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'.
struct B
{
CArray <A,A&> Array;
}; B b;
b.aStr.Add("aaaa"); struct B中放的一个关于struct A对象的数组,那么b.aStr访问的哪个A对象的aStr呢?这边设计有问题
C++中如果不指定访问属性默认是私有的,显示改为public