2010-12-30 13 views
5

Tôi có một lớp bằng C++ để viết các tệp nhật ký cho một ứng dụng của tôi. Tôi đã xây dựng lớp và nó hoạt động, nó là một cái gì đó như thế này:Quản lý luồng đăng nhập bằng C++ theo ký hiệu cout giống như

class Logger { 
    std::string _filename; 
public: 
    void print(std::string tobeprinted); 
} 

Vâng, rõ ràng là độ, để in một dòng trong file log, cho một đối tượng của Logger, nó chỉ đơn giản là cần phải làm như sau:

Logger mylogger("myfile.log"); 
mylogger.print(std::string("This is a log line")); 

Vâng. Sử dụng phương pháp tiếp cận phương pháp không giống như sử dụng mẫu tốt hơn nhiều như < <. Tôi muốn thực hiện những việc sau:

Đó là tất cả. Tôi cho rằng tôi phải nạp chồng toán tử < < ... Nhưng quá tải sử dụng chữ ký này (một trong những cổ điển):

ostream& operator<<(ostream& output, const MyObj& o); 

Nhưng tôi không có một ostream ... Vì vậy, tôi nên làm như sau?

Logger& operator<<(Logger& output, const std::string& o); 

Đây có phải là cách phù hợp không? Cảm ơn

+0

Chức năng nào bạn muốn cung cấp không nằm trong 'std :: ofstream'? –

+0

Tôi đã có tất cả các chức năng trong lớp đăng nhập của mình, ở đây tôi chỉ cần một cách để làm cho mọi thứ trở nên C++ giống như sử dụng toán tử <<. – Andry

+0

Và bạn đang cung cấp những chức năng nào? –

Trả lời

1

Vâng, đây là cách phù hợp. Nhưng bạn sẽ phải thêm < < tình trạng quá tải của nhà điều hành cho mọi loại dữ liệu mà bạn cần đăng nhập.

+0

Ah có tất nhiên – Andry

+0

Ah thêm một câu hỏi sory, Nếu tôi sẽ sử dụng char * tôi có thể làm như sau: Logger & operator << (Logger & output, const char * o)? – Andry

+1

Nếu việc triển khai bên dưới của bạn sử dụng luồng io tiêu chuẩn, thì bạn không cần phải quá tải cho từng loại, chỉ cần tạo mẫu 'toán tử <<' và nó sẽ hoạt động tốt. – Nim

4

Tại sao không chỉ đơn giản là tạo Logger một phân lớp của std :: ostream hoặc std :: ostringstream? Sau đó, tất cả chức năng đó sẽ được triển khai.

+0

Vâng, đó là một cách chính xác ... Tôi cho rằng, trong trường hợp của tôi, tôi sẽ bị một vấn đề quá liều ... Ý tôi là, tôi sẽ có tất cả các chức năng nhưng nhiều người trong số họ sẽ vô dụng đối với tôi ... Tôi chỉ cần một số loại wrapper, Chỉ có một phương pháp là sở thích của tôi, không có gì khác .... – Andry

+0

+1: Chức năng này đã tồn tại, chỉ cần sử dụng nó. – Puppy

+0

Không có 'ostream' hay' ostringstream' nào có nhiều chức năng ảo, do đó không rõ ràng chính xác cách bạn mở rộng hoặc tăng cường chức năng chưa có trong 'ostream' hoặc' ostringstream'. –

6
class Log 
{ 
public: 

    enum Level { Debug, Error, Info }; 

    static ostream& GetStream() { return cout; } 
    static bool IsLevelActive(Level l) { return true; } 
}; 

#ifndef NO_LOG 
#define LOG_ERROR(M) do { if (Log::IsLevelActive(Log::Error)) (Log::GetStream() << "ERR: " << M << "\n"); } while (false) 
#define LOG_INFO(M) do { if (Log::IsLevelActive(Log::Info)) (Log::GetStream() << "INF: " << M << "\n"); } while (false) 
#define LOG_WARNING(M) do { if (Log::IsLevelActive(Log::Warning)) (Log::GetStream() << "WRN: " << M << "\n"); } while (false) 
#else 
#define LOG_ERROR(M) 
#define LOG_INFO(M) 
#define LOG_WARNING(M) 
#endif 

struct MyObject { 
    int a, b; 
}; 

ostream& operator<<(ostream& ostr, const MyObject& obj) { 
    ostr << "(a=" << obj.a << ", b=" << obj.b << ")"; 
    return ostr; 
} 

void test() { 
    int v1 = 42; 
    int v2 = 43; 
    LOG_INFO("value1=" << v1 << ", value2=" << v2); 

    MyObject o = {1, 2}; 
    LOG_INFO("obj=" << o); 
} 
+0

Oh .... đẹp ... Đó chắc chắn là một cách khác để làm mọi thứ ... Cảm ơn bạn rolo. – Andry

0

Bạn không thực sự muốn tạo toàn bộ luồng mới, khi đó bạn cần phải xác định lại tất cả các toán tử luồng. Bạn sẽ chỉ làm điều đó nếu bạn muốn thay đổi hoàn toàn cách dữ liệu được chuyển đổi thành dữ liệu ký tự. (Ick).

Điều tôi thấy tốt nhất là tạo một lớp sẽ theo dõi luồng và gửi nội dung của nó đến đích mà tôi chọn (trình ghi nhật ký) khi bị hủy. Điều đó, kết hợp với một loạt các macro, cung cấp cho bạn những gì bạn đang tìm kiếm: cú pháp luồng để ghi nhật ký.

Tăng cường thực sự có một số lớp học trợ giúp điều này. Nhìn vào iostreams.

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