无法理解类c ++

时间:2018-05-01 14:31:47

标签: c++ class constructor

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。但我真的不明白为什么它说它未定义。以前当我使用类时,这种代码运行良好。当时和现在的区别在于,在类构造函数中我使用了指针。那么这种类型的代码只适用于指针而不适用于结构吗?

我希望这个工作的原因是让这个"全球"真的很有用。属于结构类的对象。

2 个答案:

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