难以理解类 c++

Having trouble understanding classes c++

本文关键字:c++      更新时间:2023-10-16
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 中,我收到错误,指出未定义结构。但我真的不明白为什么它说它是未定义的。以前,当我使用类时,这种代码工作得很好。当时和现在的区别在于,在类构造函数中,我使用了指针。那么这种类型的代码是否仅适用于指针而不适用于结构体?

我希望它起作用的原因是,拥有属于结构类的"全局"对象非常有用。

这不是"理解类"的问题。你应该回过头来理解什么是"范围",这是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 中声明结构存储。它在类 myClass 中声明成员类型 myStruct(这是一种类类型(。

(请注意这个名称约定,它非常令人困惑。建议仅对成员使用这样的大写。建议的类全部为小写或以大写字母开头。

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首先初始化(按照您的指示,宽度字段中为 0(并调用其构造函数,然后 myClass 的构造函数将其字段的值更改为 24。

在你的问题被破解之前,你必须明白{}中的所有内容都在这些大括号内,因此你的问题是你有:

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

相关文章:
  • 没有找到相关文章