2010-12-29 27 views
8

có điều gì đó làm tôi thất vọng.Biến địa phương tĩnh trong các phương pháp thực hành kém?

Trong chương trình không phải luồng, tốt hơn là nên có biến tĩnh cục bộ (bên trong phương thức) hoặc thành viên lớp tĩnh?

Trong ví dụ này:

class C{ 
public: 
    C(){}; 
    void foo(); 
}; 

void C::foo(){ 
    static int bar = 0; 
    bar++; 
    printf("%d\n",bar); 
} 

Có được coi là một thực tế xấu nếu bar sẽ chỉ được sử dụng trong C::foo()?

Trả lời

7

Không tốt hơn. Chúng phục vụ các trường hợp sử dụng rất khác nhau

+4

Sự khởi đầu của câu trả lời của bạn có vẻ đầy hứa hẹn, nhưng bạn có thể xây dựng được không? –

+12

@IIyan, ngữ nghĩa trong mã của anh ấy là "in bao nhiêu lần 'foo' được gọi!". Từ những gì người ta có thể thấy trong câu hỏi của mình, điều này không liên quan gì đến trạng thái của lớp, và do đó sẽ là sai lầm khi đặt biến đó làm thành viên lớp tĩnh. Tuy nhiên, nếu 'foo' sẽ là một hàm tạo bản sao và' bar' sẽ được gọi là 'numberOfCopies', nó sẽ là một ứng cử viên tốt cho một thành viên lớp tĩnh.Vì vậy, nó phụ thuộc vào cách nó được sử dụng. –

0

Hướng đối tượng theo định hướng, thanh là một phần của trạng thái của lớp C. Đây là lý do tại sao tôi thường thích sử dụng các trường thay vì biến cục bộ tĩnh.

+0

trạng thái của đối tượng nào? các biến toàn cục (các số liệu thống kê trong ví dụ này) không phải là một phần của trạng thái của bất kỳ đối tượng nào, chúng là một phần của trạng thái toàn cục. –

+0

Cảm ơn bạn, @Gene. Tôi đã chỉnh sửa câu trả lời. –

+0

Không. Chỉ các thành viên không tĩnh mới có thể phục vụ như là "trạng thái" của một đối tượng. –

2

Nếu đó là lớp công khai, thành viên lớp tĩnh yêu cầu chỉnh sửa tệp tiêu đề. Điều này không phải lúc nào cũng mong muốn.

Tùy chọn khác là biến tập tin phạm vi, trong một không gian tên ẩn danh. Điều này là đủ nếu bạn chỉ cần truy cập trong một phương thức, và nếu bạn cần nó trong nhiều phương thức.

0

Cả biến cục bộ và phi địa phương đều "xấu" bởi đức hạnh là toàn cầu. Nhưng việc khởi tạo và truy cập cho hai trường hợp này là khác nhau, vì vậy câu trả lời mà một trường hợp sử dụng phụ thuộc vào nhu cầu của bạn về những yêu cầu đó.

Như một lưu ý phụ, việc khởi tạo động các biến cục bộ với thời gian lưu trữ tĩnh có thể không an toàn cho luồng, tùy thuộc vào trình biên dịch của bạn. Tin tốt, trong C++ 0x, nó được đảm bảo an toàn chỉ.

+0

Có ghi nhận sai với các biến toàn cục. Vấn đề là với trạng thái có thể truy cập có thể truy cập trên toàn cầu. Không đúng ở đây. –

4

Tôi thường cố gắng giới hạn phạm vi của các biến càng nhiều càng tốt, miễn là nó không trở nên kỳ lạ hoặc tẻ nhạt.

Nếu bạn có 1000 dòng mã trong class C, trong số đó 100 dòng mã trong hàm foo, bất kỳ thay đổi mà bạn làm để bar (ví dụ, thay đổi tên hoặc gõ) đòi hỏi phải đi hơn 100 dòng mã để làm chắc chắn thay đổi là OK. Nếu bạn có bar một thành viên lớp tĩnh, bạn có thể phải đi qua 1000 dòng mã, chỉ để đảm bảo rằng bar không được sử dụng ở đó. Đây sẽ là một sự lãng phí thời gian.

Nếu bạn nghĩ rằng bạn có thể cần bar trong một chức năng foo2 (ví dụ, khi đếm đếm cuộc gọi cho foofoo2 với nhau), bạn có thể muốn làm bar thành viên lớp tĩnh.

+0

+1 Giảm thiểu phạm vi biến "tĩnh" là quan trọng. Mô-đun so với toàn cầu so với .cpp so với lớp so với phương thức/hàm so với khối lồng nhau {}. Tôi có xu hướng thích sử dụng dữ liệu tĩnh cấp mô-đun .cpp hơn là được bao gồm trong một khai báo lớp, bởi vì nếu bạn gắn nó vào tiêu đề lớp, thì các máy khách bây giờ phụ thuộc vào một chi tiết thực hiện. – franji1

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