class myClass
{
private:
struct myStruct
{
int width = 0;
};
public:
myClass();
void changeValue();
};
myClass::myClass()
{
myStruct aStruct;
aStruct.width = 24;
}
void myClass::changeValue()
{
aStruct.width = 23;
}
我制作了上面的简单代码以测试类。在成员函数changeValue中,我得到错误,指出未定义aStruct。但我真的不明白为什么它说它未定义。以前当我使用类时,这种代码运行良好。当时和现在的区别在于,在类构造函数中我使用了指针。那么这种类型的代码只适用于指针而不适用于结构吗?
我希望这个工作的原因是让这个"全球"真的很有用。属于结构类的对象。
答案 0 :(得分:3)
这不是“理解课程”的麻烦。你应该回过头来理解“范围”是什么,这是C ++语言的基本概念之一。
myStruct aStruct;
属于成员函数myClass::myClass()
的范围,并且在该函数的执行结束时不再存在。这是完全不同的范围,那里不存在aStruct变量。
void myClass::changeValue()
{
aStruct.width = 23; // aStruct doesn't exist in any available scope
}
现在关于声明:
class myClass
{
private:
struct myStruct
{
int width = 0;
};
此代码未在类myClass
中声明结构存储。它在类myStruct
内声明 成员类型 myClass
(类型)。
(警惕这个名称惯例,它非常令人困惑。建议仅对成员使用大写。建议小写为小写或以大写字母开头。)
class myClass
{
private:
struct myStruct
{
int width = 0;
};
myStruct aStruct; // myClass got field aStruct
public:
myClass() : aStruct {24} {}
void changeValue();
};
aStruct
这里属于类范围的私有部分,可供此类的所有成员使用。 myStruct
也被声明为私有,因此不能在类外使用,在子类中或在外部范围内使用。
myClass() : aStruct {24} {}
这是一个带有初始化列表的非平凡(用户定义)构造函数。 aStruct
是此类的字段,因此可以使用这样的值初始化它。它与此表格不同
myClass()
{
aStruct.width = 24;
}
在后一种情况下,aStruct
将初始化 first (在宽度字段中为0,正如您所指示的那样)并且将调用其构造函数,然后myClass
的构造函数将其字段的值更改为24。
答案 1 :(得分:1)
在您的问题被破坏之前,您必须了解{}
中的所有内容都限定在这些大括号内,因此您的问题在于:
myStruct aStruct;
内部构造函数。所以aStruct
是构造函数的局部变量。为了修复您的代码,请将其移至struct
定义下方。
class myClass
{
private:
struct myStruct
{
int width = 0;
};
// MOVE IT HERE
myStruct aStruct;
public:
myClass();
void changeValue();
};
myClass::myClass()
{
aStruct.width = 24;
}
void myClass::changeValue()
{
aStruct.width = 23;
}
现在所有成员函数都可以访问aStruct
。