在 C++ 中的 main() 函数中声明的类

Posted

技术标签:

【中文标题】在 C++ 中的 main() 函数中声明的类【英文标题】:Declared class inside the main() function in C++ 【发布时间】:2017-10-11 10:51:17 【问题描述】:

在下面的程序中,我在 main() 函数中声明了类。

案例 1:

int main()

        static int i = 10; // static variable

        class A
        
        public:
                A()
                
                    std::cout<<i;
                
        ;
        A a;
        return 0;

它在 G++ 编译器中运行良好。

但是,如果我删除 static 关键字并编译它,编译器会报错。

案例 2:

int main()

        int i = 10; // removed static keyword

        class A
        
        public:
                A()
                
                    std::cout<<i;
                
        ;
        A a;
        return 0;

错误:

 In constructor 'main()::A::A()':
13:32: error: use of local variable with automatic storage from containing function
:cout<<i;
                                ^
7:13: note: 'int i' declared here
         int i = 10;
             ^

为什么案例 1 工作正常?为什么案例 2 不起作用?

【问题讨论】:

你的问题是什么? 【参考方案1】:

为什么它不起作用?

复制/粘贴自 https://www.quora.com/Why-cant-local-class-access-non-static-variables-of-enclosing-function

您想知道类之外的变量。我会解释 这是非 C++ 方式。我们从一般的范式来看 机器架构和编程语言的方式 定义。问题是堆栈帧、堆栈的概念以及如何 程序引用内存位置。

当一个函数被调用时,该函数的变量被压入 到堆栈上。函数及其变量通常是一系列 内存位置。当函数完成时,它和那些 变量从堆栈中弹出。这意味着当函数是 调用,变量开始存在。功能完成后, 变量立即离开。每个变量,就像函数本身 是内存位置(可以分配给寄存器)。

声明类并不声明变量。班级只是一个 C++ 世界中的定义并且与变量没有链接 在外部范围内定义。短语,自动存储持续时间,是 与变量(内存)的概念大致同义 函数退出时自动恢复。尽管它是 C++,当它编译时,它仍然是机器语言,并且会遵守 机器的规则。您在类上调用的方法是 类,但不是函数的一部分。只有类定义 是函数的局部变量。

所有函数,无论它们存在于何处,都是它们自己的堆栈 框架。完成堆栈帧的标准方式意味着,除非内存 引用的位置有效,则数据将无法由 调用类中的函数的时间。在这种情况下,它不是 因为外部作用域中的变量已经被回收了,但是 因为当类中的方法被调用时,栈帧在 外部变量存在的在系列中不活跃 被调用的方法使用的寄存器。编译器被编码 了解此过程并给出错误消息 避免尝试进行此类访问时会出现的麻烦。

如果您将 static 关键字附加到 变量。这在 C++ 中的本地类网页中提到 具有您列出的相同代码示例。基本上,你必须 延长存储时间或内存的持续时间 变量在封闭范围内仍然有效。一般来说,一个好方法 思考这些错误信息是通过了解 语言规范,但就时间而言,与 回到机器架构的表示可以归零 根本原因。

如何解决?

只需将您想在类内部使用的变量作为参数传递给构造函数(我已将其设为引用成员,因此i 中的更改也将在类内部可见,但是请注意,一旦函数退出,i 将超出范围):

#include<iostream>

int main()

  int i = 10; // static variable

  class A
  
  private:
    int &r_i;
  public:
    A(int &i)
    :
      r_i(i)
    
      std::cout<<r_i;
    
  ;
  A a(i);
  return 0;

【讨论】:

这个答案令人困惑,很可能是错误的。通过这种推理,您的“解决方法”和 lambdas 都不应该工作,例如因为通过传递引用并没有改变变量的原始位置,它仍然在不同的堆栈帧中。而Declaring the class does not declare a variable 甚至不相关,因为 OP 也声明了变量。【参考方案2】:

我不确定如果我错了请纠正我,这可能是因为静态变量和类都存储在堆中,因此情况 1 工作正常,而情况 2 作为变量 i 未存储在堆中它创建问题。

【讨论】:

以上是关于在 C++ 中的 main() 函数中声明的类的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的类的函数内部声明变量

在 C++ 中的类构造函数中初始化结构数组

如何在 C++ 中的类中递归调用函数方法?

如何从 C++ 中的类文件运行函数?

C++ 枚举类型声明可以放在 int main 的前面吗?

c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样