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

iaqfqrcu  于 2023-02-26  发布在  其他
关注(0)|答案(3)|浏览(245)

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

案例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不工作?

fumotvh3

fumotvh31#

∮ ∮为什么不管用?∮
https://www.quora.com/Why-cant-local-class-access-non-static-variables-of-enclosing-function复制/粘贴
你想知道类外的变量。我将用非C的方式来解释它。让我们从通用机器架构的范例和编程语言的定义方式来看它。问题是堆栈帧、堆栈的概念以及程序如何引用内存位置。
当一个函数被调用时,该函数的变量被推到堆栈上。一个函数及其变量通常是内存位置的序列。当函数完成时,它和那些变量被弹出堆栈。这意味着当函数被调用时,变量开始存在。当函数完成时,变量立即离开。每个变量,与函数本身一样,存储器位置(可以分配给寄存器)。
声明类并不声明变量。类只是C
世界中的一个定义,与外部作用域中定义的变量没有任何链接。短语“自动存储持续时间”与变量的概念大致同义(内存)在函数退出时自动恢复。即使它是C++,当它编译时,它仍然是机器语言,并且将服从机器的规则。2你在类上调用的方法是类的一部分,但不是函数的一部分。3只有类定义是函数的局部。
所有的函数,不管它们存在于何处,都是它们自己的堆栈帧。堆栈帧的标准方式意味着,除非引用的内存位置有效,否则在调用类中的函数时,数据将不可访问。在这种情况下,这不是因为外部作用域中的变量已经被回收,而是因为当调用类中的方法时,外部变量所在的堆栈帧在被调用的方法所使用的寄存器序列中是不活动的。编译器的编码理解了这个过程,并给出了一个错误消息,以避免如果试图进行这样的访问会引起的麻烦。
如果你给变量加上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;
}
ybzsozfc

ybzsozfc2#

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

3pmvbmvn

3pmvbmvn3#

/*Class inside the main using the c++.*/
    #include<iostream>
    #include<string>
    using namespace std;
    
    int main(){
    class Details{
public :
string name;
string address;
int regNo;
Details(string name, string address, int regNo){
this->name = name;
this->address = address;
this->regNo = regNo;
}

void display(){
cout << "The name of the student is : " << name << "\n";
cout << "The address of the student is : " << address << "\n";
cout << "The register number is : " << regNo << "\n";
}
};

cout << "Enter the name of the student : ";
string name;
cin >> name;

cout << "Enter the address of the student : ";
string address;
cin >> address;

cout << "Enter the register number : ";
int regNo;
cin >> regNo;

Details dt(name, address, regNo);
dt.display();
return 0;
}

相关问题