簡體   English   中英

C++ 中 main() 函數中聲明的類

[英]Declared class inside the main() function in C++

在下面的程序中,我在 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?

為什么不起作用?

https://www.quora.com/Why-cant-local-class-access-non-static-variables-of-enclosure-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;
}

如果我錯了,我不確定請糾正我,這可能是因為靜態變量和類都存儲在堆中,因此情況 1 工作正常,而在情況 2 中,由於變量 i 未存儲在堆中,因此會產生問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM