2011-12-02 26 views
12

Chỉ cần ra khỏi tò mò: nếu tôi đã lồng phạm vi, như trong mẫu C++ đangCó cách nào để truy cập một biến cục bộ trong phạm vi ngoài trong C++ không?

using namespace std; 

int v = 1; // global 

int main (void) 
{ 
    int v = 2; // local 
    { 
     int v = 3; // within subscope 
     cout << "subscope: " << v << endl; 
     // cout << "local: " << v << endl; 
     cout << "global: " << ::v << endl; 
    } 
    cout << "local: " << v << endl; 

    cout << "global: " << ::v << endl; 

} 

Có cách nào để truy cập biến v với giá trị 2 từ phạm vi "trung gian" (không phải toàn cầu cũng không địa phương)?

+11

Điều này sẽ không hợp lệ trong C#. –

+3

Tôi sẽ nói rằng đây là một thực tế khá tệ để bắt đầu, sử dụng cùng tên biến trong mỗi phạm vi mới dường như không phải là một ý tưởng hay vì bất kỳ lý do gì. –

+0

không. nếu bạn cần truy cập nó, hãy đổi tên các biến. – Dani

Trả lời

14

Bạn có thể khai báo một tham chiếu mới như một bí danh như vậy

int main (void) 
{ 
    int v = 2; // local 
    int &vlocal = v; 
    { 
     int v = 3; // within subscope 
     cout << "local: " << vlocal << endl; 
    } 
} 

Nhưng tôi sẽ tránh thực hành này này hoàn toàn. Tôi đã bỏ ra hàng giờ để gỡ lỗi một cấu trúc như vậy vì một biến được hiển thị trong trình gỡ rối như đã thay đổi vì phạm vi và tôi không thể tìm ra cách nó đã thay đổi như thế nào.

+0

và mục đích của việc này thay vì chỉ đổi tên 'v' thành' vlocal' sẽ là? – Nim

+6

@Nim Nếu OP quan ngại về việc thay đổi một số mã di sản spaghetti với sự thay đổi tối thiểu –

7

Câu trả lời là Không Bạn không thể.
Biến trong phạm vi cục bộ sẽ làm biến đổi phạm vi toàn cục và ngôn ngữ cung cấp cách để truy cập biến toàn cục bằng cách sử dụng tên đủ điều kiện của toàn cục như bạn đã làm. Nhưng C++ là một ngôn ngữ không cung cấp dù sao truy cập biến phức tạp trung gian.

Xem xét nó sẽ phải được cho phép nó sẽ đòi hỏi rất nhiều xử lý phức tạp, Hãy tưởng tượng của tình hình với n số phạm vi (rất có thể là vô hạn) và xử lý của những người.

Bạn nên đổi tên các biến trung gian của mình và sử dụng các biến số hợp lý và dễ bảo trì hơn.

+0

Ví dụ về số lượng phạm vi vô hạn là gì? Hay bạn chỉ muốn nói một số lượng lớn các phạm vi? – Garrett

1

Bạn có thể giả mạo nó như thế này:

#include <iostream> 
using namespace std; 
int v = 1; 

int main() 
{ 
     int v = 2; 
     { 
       int &rv = v; // create a reference 
       int v = 3; // then shadow it 

       cout << "subscope: " << v << endl; 
       cout << "local: " << rv << endl; 
       cout << "global: " << ::v << endl; 
     } 
     cout << "local: " << v << endl; 

     cout << "global: " << ::v << endl; 

     return 0; 
} 

Điều thú vị này biên dịch trên Cygwin g ++ nhưng segfaults nếu bạn cố gắng chạy nó:

#include <iostream> 
using namespace std; 
int v = 1; 

int main() 
{ 
     int v = 2; 
     { 
       int &v = v; 
       cout << "subscope: " << v << endl; 
       // cout << "local: " << v << endl; 
       cout << "global: " << ::v << endl; 
     } 
     cout << "local: " << v << endl; 

     cout << "global: " << ::v << endl; 

     return 0; 
} 
4

Có hai loại scope resolution nhà khai thác trong C++ - phạm vi đơn nhất và phạm vi lớp học. Không có phạm vi hàm hoặc toán tử phân giải "bất kỳ phạm vi cha mẹ cụ thể nào". Điều đó làm cho nó không thể giải quyết vấn đề của bạn, vì nó là, nói chung bởi vì bạn không thể tham khảo phạm vi vô danh. Tuy nhiên, bạn có thể tạo một bí danh, đổi tên biến, hoặc biến nó thành một phần của lớp, điều này tất nhiên ngụ ý một sự thay đổi mã. Đây là gần nhất tôi có thể giúp bạn có được mà không đổi tên trong trường hợp đặc biệt này:

#include <iostream> 

using namespace std; 

int v = 1; // global 

class Program 
{ 
    static int v; // local 

public: 
    static int main() 
    { 
     int v = 3; // within subscope 
     cout << "subscope: " << v << endl; 
     cout << "local: " << Program::v << endl; 
     cout << "global: " << ::v << endl; 
    } 
}; 

int Program::v = 2; 

int main() 
{ 
    return Program::main(); 
} 

Có nhiều cách khác, như đảm bảo rằng các biến không được tối ưu hóa ra và đang trên stack, sau đó bạn có thể làm việc với chồng trực tiếp để có được giá trị của biến mà bạn muốn, nhưng chúng ta không đi theo cách đó.

Hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan