2011-12-21 29 views
6

Tôi đang viết một số mã 'xách tay' (nghĩa là nó nhắm vào 32 và 64-bit MSVC2k10 và GCC trên Linux), trong đó tôi có, nhiều hơn hoặc ít hơn:Tình trạng quá tải của nhà điều hành toàn cầu?

typedef unsigned char uint8; 

C-chuỗi luôn uint8 ; điều này là vì lý do xử lý chuỗi. Mã kế thừa cần phải được biên dịch như đã ký, vì vậy tôi không thể thiết lập các trình biên dịch để mặc định nó thành unsigned. Nhưng nếu tôi đang xử lý một chuỗi tôi có thể không phải là rất tốt chỉ số một mảng:

char foo[500]; 
char *ptr = (foo + 4); 
*ptr = some_array_that_normalizes_it[*ptr]; 

Bạn có thể không chỉ một mảng với một số tiêu cực tại thời gian chạy mà không hậu quả nghiêm trọng. Việc giữ C-strings unsigned cho phép bảo vệ dễ dàng hơn từ các lỗi.

Tôi thực sự muốn không phải tiếp tục truyền (char *) mỗi khi tôi sử dụng một hàm có tính năng char *, và cũng có thể ngừng sao chép các hàm lớp để chúng có thể. Điều này đặc biệt một nỗi đau vì một chuỗi liên tục được ngầm thông qua như là một char *

int foo = strlen("Hello"); // "Hello" is passed as a char * 

Tôi muốn tất cả các làm việc:

char foo[500] = "Hello!"; // Works 
uint8 foo2[500] = "Hello!"; // Works 
uint32 len = strlen(foo); // Works 
uint32 len2 = strlen(foo2); // Doesn't work 
uint32 len3 = strlen((char *)foo2); // Works 

Có lẽ hãy cẩn thận để cho phép chuyển đổi kiểu ngầm của thiên nhiên này Tuy nhiên, nó sẽ được tốt đẹp để sử dụng các chức năng mà có một char * mà không có một diễn viên mỗi lần.

Vì vậy, tôi đã tìm một cái gì đó như thế này sẽ làm việc:

operator char* (const uint8* foo) { return (char *)foo; } 

Tuy nhiên nó không. Tôi không thể tìm ra cách nào để nó hoạt động. Tôi cũng không thể tìm thấy bất cứ điều gì để cho tôi biết tại sao dường như không có cách nào để làm điều này. Tôi có thể thấy logic có thể - chuyển đổi tiềm ẩn như vậy có thể là nguyên nhân gây ra FAR quá nhiều lỗi - nhưng tôi không thể tìm thấy bất cứ điều gì nói rằng "điều này sẽ không hoạt động trong C++" hoặc tại sao, hoặc cách làm cho nó hoạt động (thiếu làm uin8 một lớp học vô lý).

+3

Bạn không thể viết phôi (hoặc toán tử) không liên quan đến ít nhất một người dùng được xác định loại –

+0

Bạn có mã cũ sử dụng 'ký char' ?? Tôi rất nghi ngờ rằng ... –

+2

tại sao làm cho uint8 một lớp vô lý? Nó không phải là vô lý hơn là có một loạt các chức năng đúc toàn cầu đi lạc. – ThomasMcLeod

Trả lời

1

Tôi không phải là một fan hâm mộ lớn của nhà điều hành [ab] sử dụng, nhưng đó là những gì c + + là đúng?

Bạn có thể làm như sau:

const char* operator+(const uint8* foo) 
{ 
    return (const char *)foo; 
} 

char* operator+(uint8* foo) 
{ 
    return (char *)foo; 
} 

Với đối tượng quy định, ví dụ của bạn với phần trên:

uint32 len2 = strlen(foo2); 

sẽ trở thành

uint32 len2 = strlen(+foo2); 

Nó không phải là một diễn viên tự động, nhưng bằng cách này bạn có một cách dễ dàng, nhưng rõ ràng để làm điều đó.

+0

Cảm ơn bạn, ý tưởng hay! –

+0

Wow ............ –

0

Cả hai trình biên dịch bạn đề cập đều có nút "xử lý ký tự là chưa ký". Tại sao không sử dụng?

+0

Vi phạm mã cũ. Như tôi đã nói như ... câu thứ hai. –

+0

Ồ ... Tôi không chắc chắn về bản chất của chương trình của bạn sau đó. Tôi nghĩ bạn đang viết một cái gì đó mới! (như bạn đã nói trong câu đầu tiên) –

3

dàn diễn viên toàn cầu (thợ đúc chư) điều hành, toán tử gán toàn cầu, điều hành mảng subscript toàn cầu và toàn cầu chức năng gọi điều hành quá tải đang không được phép trong C++.

MSVS C++ sẽ được tạo C2801 errors trên chúng. Look at wiki cho danh sách các toán tử C++ và các quy tắc quá tải.

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