【问题标题】:Having trouble understanding classes c++难以理解类 c++
【发布时间】:2018-05-01 14:31:46
【问题描述】:
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 未定义。但我真的不明白为什么它说它是未定义的。以前,当我使用类时,这种代码运行良好。当时和现在的区别在于,在类构造函数中我使用了指针。那么这种类型的代码是否只适用于指针而不适用于结构?

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

【问题讨论】:

  • In the member function changeValue i get the error saying that aStruct is not defined. 是的,因为它没有定义。您需要将 myStruct aStruct; 移动到您的类中,而不是在构造函数中。
  • 在构造函数中,你创建一个临时变量,一旦你离开构造函数就会被销毁。
  • @dimChtz 是的,这正是我想要的。当您启动这样的对象时,您会怎么称呼?它只是类的本地对象吗?
  • @JimmyJoe 在这种情况下,aStruct 只是myClass 的成员。
  • 你需要一本关于 C++ 的书。请注意,C 书甚至不会将其删减为基础知识,它们在语法和语义上都不是 100% 匹配的。 C++ 是一种危险的抽象语言,仅仅看代码的形式是无法理解的。更糟糕的也许只有 LUA 和 Rust。

标签: c++ class constructor


【解决方案1】:

这不是“理解类”的问题。你应该回过头来理解什么是“范围”,它是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;
    };

此代码未在 classmyClass 内声明结构存储。它在类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,正如您所指示的)并且将调用其构造函数,然后 myClasss 构造函数将更改值其字段为 24。

【讨论】:

  • 好吧,也许我当时误解了构造函数。因为我一直认为它创建了一个类本地的对象,并且将存在于属于该类的每个函数中。
  • @JimmyJoe 不,类只是一种存储,没什么特别的。像那样。将类的成员函数(方法)视为结构内部的函数指针。 C ++中的结构和类没有区别,它们都是类类型。 C++ 中的对象是一种存储,包含一个元素或 any 类型的数组。构造函数始终存在,当您声明自己的构造函数时,您定义了存储开始存在时会发生什么。
【解决方案2】:

在您的问题被解决之前,您必须了解{} 中的所有内容都包含在这些大括号内,因此您的问题是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多