2015-10-21 16 views
7

Tôi đang cố tạo lớp học với các phép tính lười. Vì vậy, tôi cần cấu trúc để giữ các biến được tính trước đó và tôi muốn đặt lớp đó vào không gian tên chưa đặt tên (không muốn gây ô nhiễm phạm vi toàn cục). Đây là mã tối thiểu mà giải thích những gì tôi muốn: calculator.h:Cách chuyển tiếp lớp khai báo trong không gian tên chưa đặt tên

#ifndef CALCULATOR_H 
#define CALCULATOR_H 

class PrevCalc; 
class Calculator 
{ 
public: 
    Calculator(); 
    PrevCalc* prevCalc; 
}; 

#endif // CALCULATOR_H 

calculator.cpp:

#include "calculator.h" 
namespace{ 
    struct PrevCalc{ 
     double prevA = -1; 
     double prevB = -1; 
     double prevC = -1; 
    }; 
} 
Calculator::Calculator() 
{ 
    prevCalc = new PrevCalc(); 
} 

Tất nhiên nó mang lại cho một lỗi expected type-specifier before 'PrevCalc' và nếu tôi xác định PrevCalc không gian tên tất cả mọi thứ hoạt động tốt. Câu hỏi của tôi là làm thế nào để khai báo lớp đó sẽ được xác định trong không gian tên vô danh trong .cpp tập tin

+2

Một namespace vô danh trong một tiêu đề chắc chắn là một thiết kế sai. –

+1

Không gian tên ẩn danh ** được dự định ** để giới hạn phạm vi cho phạm vi tệp. Một không gian tên được đặt tên có thể phù hợp với nhu cầu của bạn tốt hơn. – Downvoter

+6

Tại sao không thực hiện 'PrevCalc' một cấu trúc lồng nhau của' Máy tính'? Bạn sẽ không cần phân bổ động nó sau đó. –

Trả lời

5

Câu hỏi của tôi là làm thế nào để khai báo lớp đó sẽ được xác định trong không gian tên vô danh trong .cpp tập tin

Bạn không thể. Không gian tên chưa đặt tên rõ ràng có nghĩa là hiển thị riêng tư cho đơn vị dịch hiện tại mà nó xuất hiện và không thể được sử dụng cho các khai báo chuyển tiếp vốn có.

Có thể bạn nên sử dụng pimpl idiom nếu bạn muốn ẩn chi tiết triển khai.


Một cách tiếp cận phổ biến là sử dụng một không gian tên internal_, và ghi lại nó không có nghĩa là cho public sử dụng:

namespace calculators { 
namespace internal_ { 
    struct PrevCalc{ 
     double prevA = -1; 
     double prevB = -1; 
     double prevC = -1; 
    }; 
} 

class Calculator { 
public: 
    Calculator(); 
private: // !!!! 
    internal_::PrevCalc* prevCalc; 
}; 
} 
+0

Vấn đề là, chỉ có một không gian tên vô danh cung cấp cho bạn liên kết nội bộ. Nó là khá buồn, không có cách nào để tự do sử dụng một thành viên lớp hoàn toàn nội bộ (hoặc chức năng thành viên) mà không có hack. Hope Modules sẽ cải thiện điều đó! Ít nhất chúng ta sẽ có các lớp mô-đun nội bộ và không có gì. – user362515

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