2013-08-03 56 views
10

Manyotherquestions giải quyết cách phân bổ biến bằng cách khai báo biến đó trong tệp tiêu đề và xác định nó (phân bổ) trong tệp .cpp.Khai báo và xác định biến tĩnh trong tiêu đề C++?

Điều tôi muốn làm là không sử dụng bất kỳ tệp .cpp nào cho lớp của tôi và để xác định tất cả các hàm dưới dạng nội dòng (trong tệp tiêu đề). Vấn đề mà tôi gặp phải là làm thế nào để định nghĩa các biến thành viên tĩnh để ngay cả khi tệp .h được bao gồm trong nhiều đơn vị biên dịch, tôi không nhận được lỗi liên kết "được định nghĩa đầu tiên ở đây".

Tôi đang mở để xử lý tiền xử lý, v.v. nếu công việc được thực hiện. Tôi chỉ muốn tránh mọi tệp .cpp.

Nếu vấn đề là tôi đang sử dụng GCC.

+0

Bạn chỉ cần khai báo biến của mình là 'tĩnh'. Một thể hiện mới của biến sẽ được tạo ra trong mỗi đơn vị dịch mà bạn bao gồm tệp tiêu đề, nhưng tại thời điểm liên kết, sẽ không có xung đột vì các đối tượng có liên kết tĩnh ... –

+0

Không, thành viên dữ liệu tĩnh có liên kết bên ngoài. – jrok

+0

"xác định nó (phân bổ)": ** xác định ** và ** phân bổ ** là hai thứ khác nhau. –

Trả lời

13

bạn có thể lạm dụng Singleton pattern nếu bạn thực sự phải tránh bất kỳ cpp tệp:

class Foo { 
    public: 
     static Bar& getMyStatic() { 
      static Bar bar; 
      return bar; 
     }; 
}; 

Điều này hoạt động vì bây giờ biến là biến tĩnh bên trong hàm và static có ý nghĩa khác trong ngữ cảnh hàm so với ngữ cảnh lớp. Và đối với các chức năng, trình liên kết nhận ra nhiều định nghĩa giống nhau và ném đi các bản sao. Tuy nhiên, tất nhiên, tôi đặc biệt khuyên bạn không nên tránh các tệp .cpp: Điều đó có nghĩa là bạn gặp phải tình huống mà bạn phải xây dựng toàn bộ chương trình, hoặc ít nhất là một phần lớn của nó, trong một phần lớn. Mọi thay đổi bạn thực hiện sẽ đòi hỏi một bản dựng lại hoàn chỉnh làm chậm chu kỳ kiểm tra biên dịch thay đổi của bạn một cách đáng kể. Đối với các dự án rất nhỏ có thể không phải là một vấn đề, nhưng nó là cho các dự án trung bình đến lớn.

+0

Điều này có vẻ là cách tốt nhất (và chỉ) để tránh đặt các biến tĩnh trong tệp .cpp. Đối với thời gian biên dịch: mã được biên dịch của tôi được giới hạn ở 32KB, do đó đặt giới hạn trên sẽ mất bao lâu. – srlm

-1

Miễn là bạn chỉ bao gồm tệp tiêu đề đó một lần trong toàn bộ dự án của mình, bạn sẽ OK. Tuy nhiên, đó là một yêu cầu khá mạnh, và có thể khó khăn để làm cho người khác tuân theo.

Bạn có thể có biến số static, nhưng điều đó có nghĩa là bạn có nhiều hơn một chương trình, có thể hoặc không quan trọng (nhớ rằng bạn không thể thay đổi nó trong tương lai, vì vậy bạn có thể có được gọi là "lỗi tiềm ẩn" - bạn thay đổi một số mã khác, và đột nhiên bạn đã tạo ra một lỗi mới, bởi vì biến không phải là MỘT biến).

+1

Rắc rối là nó có thể không bắt đầu mà nó quan trọng nhưng trong tương lai nó có thể làm và bạn vô tình giới thiệu một lỗi –

+0

Tuyệt đối, đó là một điểm tốt. –

0

Với biến tĩnh bạn phải đặt trong tệp .cpp để tránh khả năng xảy ra nhiều biến tĩnh khi dự định chỉ có một biến. Bên cạnh đó không phải là một ý tưởng tốt để có các phương thức nội tuyến lớn vì nó chỉ là một gợi ý cho trình biên dịch mà còn làm cho việc biên dịch mất nhiều thời gian hơn (bạn thay đổi một số hàm đó trong quá trình phát triển và sau đó nhiều tệp phụ thuộc sẽ cần được biên dịch!)

Tuy nhiên nếu bạn không muốn quá nhiều file cpp chỉ với một vài tĩnh học trong đó tại sao không chỉ có một tập tin để lưu trữ chúng trong.

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