看如下示例:
class
CStudent
... {
public:
CStudent(int age = 16)
...{
m_age = age;
}
... {
public:
CStudent(int age = 16)
...{
m_age = age;
}
private:
int m_age;
}
class CClass
... {
}
class CClass
... {
lpublic:
CClass()
...{
}
private:
CStudent m_student1;
CStudent m_student2(10); // 试图声明一个m_age = 10的成员
// 错误error C2059: syntax error:’constant’
}
CClass()
...{
}
private:
CStudent m_student1;
CStudent m_student2(10); // 试图声明一个m_age = 10的成员
// 错误error C2059: syntax error:’constant’
}
如上例,要想在类CClass中使用一个带参数的对象m_student2,以上的定义方式是错误的。
语法上说,编译器把这个CStudent m_student2(10);当成了函数声明,报告错误:error C2059: syntax error:’constant’
从类定义的角度来看,定义成员变量时并不会实例化该变量,没有内存分配,但是CStudent m_student2(10);这种写法也意味着实例化一个对象,所以是不允许的。那么,这也意味着直接声明一个带参数的成员变量是不可能的,不知道这种理解对不对?
现在的解决的办法:
1. 定义一个CStudent的指针,在CClass的构造函数中,定义student2,在构造函数中实例化是没有问题的。
class
CClass
... {
... {
public:
CClass()
...{
m_pStudent2 = new CStudent(10); // 实例化
}
~CClass()...{
delete m_pStudent2; // ??不知道这里是不是必须delete
// 如果不写CClass对象失效后 会自动释放吗?
}
private:
CStudent m_student1;
CStudent m_pStudent2; //定义指针
}
CClass()
...{
m_pStudent2 = new CStudent(10); // 实例化
}
~CClass()...{
delete m_pStudent2; // ??不知道这里是不是必须delete
// 如果不写CClass对象失效后 会自动释放吗?
}
private:
CStudent m_student1;
CStudent m_pStudent2; //定义指针
}
2. 在CStudent中加入SetAge()方法,CClass中定义CClass m_student2,然后在CClass的构造函数中调用m_student2.SetAge(10);
class
CStudent
... {
public:
CStudent(int age = 16)
...{
m_age = age;
}
void SetAge(int age)
...{
m_age = age;
}
... {
public:
CStudent(int age = 16)
...{
m_age = age;
}
void SetAge(int age)
...{
m_age = age;
}
private:
int m_age;
}
class CClass
... {
}
class CClass
... {
public:
CClass()
...{
m_student2.SetAge(10); //
}
private:
CStudent m_student1;
CStudent m_student2; //
}
CClass()
...{
m_student2.SetAge(10); //
}
private:
CStudent m_student1;
CStudent m_student2; //
}
不知道是否有更好的解决方法,希望高手指点~~
新求的一中写法
class
CClass
... {
public:
CClass():m_student2(10); // 参数赋值
...{
}
private:
CStudent m_student1;
CStudent m_student2;
}
... {
public:
CClass():m_student2(10); // 参数赋值
...{
}
private:
CStudent m_student1;
CStudent m_student2;
}
感觉是最合适的写法了。