在 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() 函数中声明的类的主要内容,如果未能解决你的问题,请参考以下文章