2011-12-21 24 views
6

Ben sahip olduğu, az ya da çok (o 32 ve 64-bit Linux üzerinde MSVC2k10 ve KİK hedeflediği anlamına gelir) bazı 'taşınabilir' kod yazıyorum:Global typecast operator aşırı yüklendi mi?

typedef unsigned char uint8; 

C-dizeleri hep uint8 vardır ; Bu string işleme nedenleri içindir. Eski kodun char olarak imzalanmış olması gerekir, bu yüzden derleyici anahtarlarını imzasız olarak ayarlayamam. Ama indeksi çok iyi değil bir dizi bunu yapabilecek bir dize işleme ediyorsam:

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

Sen endeksleyemez ciddi sonuçlar olmadan çalışma zamanında negatif bir sayı ile bir dizi. C-dizelerini imzasız tutmak, hatalardan daha kolay koruma sağlar.

Ben char * 's alır bir işlevi kullandığımda her zaman döküm (char *) tutmak zorunda kalmazsınız ve aynı zamanda sınıf işlevlerini çoğaltmalarını da engeller.

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 

Muhtemelen uyarılar bu nitelikteki örtülü tip dönüşümleri izin vermeye: bir dizge sabit örtük *

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

işe tüm bu istediğiniz bir char olarak geçirilir, çünkü bu özellikle bir acıdır Bununla birlikte, her seferinde bir kadroya sahip olmayan bir char * alan işlevleri kullanmak iyi olur.

Yani, böyle bir şey çalışmak düşündüm:

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

öyle değil Ancak. Çalışması için herhangi bir yol bulamıyorum. Ayrıca, bunu yapmanın bir yolu olmadığını gösteren bir şey bulamıyorum. Olası mantığı görebiliyorum - bunun gibi FAR'ın çok fazla hata nedeni olabilir - ama "C++ 'da çalışmayacak" ya da neden veya nasıl iş yapılacağını söyleyen hiçbir şey bulamıyorum (kısaca uin8'i saçma bir sınıf yapmak).

+3

En az bir kullanıcı tanımlı tür içermeyen yayıncılar (veya işleçler) yazamazsınız –

+0

'imzalı char' kullanan eski kodunuz var mı ?? Ben çok şüphe ediyorum ... –

+2

neden uint8 bir sınıf saçma yapıyor? Bir sürü başıboş küresel döküm fonksiyonuna sahip olmaktan daha gülünç değil. – ThomasMcLeod

cevap

1

Operatörün büyük bir hayranı değilim [ab] kullanıyorum, ama bu C++ ne için doğru? tanımlanan ile

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

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

, senin örneğin yukarıdan:

uint32 len2 = strlen(foo2); 

Bu otomatik döküm değil

uint32 len2 = strlen(+foo2); 

olacak, ancak

Aşağıdaki yapabilirsiniz bu sayede bunu yapmanın kolay, ama açık bir yolu vardır.

+0

Teşekkür ederim, iyi fikir! –

+0

Vay ............ –

0

Bahsettiğiniz her iki derleyicide de "işaretlenmemiş olarak işaretleme" anahtarına sahipler. Neden bunu kullanmıyorsun?

+0

Eski kod kırılıyor. Sanki ikinci cümle gibi söyledim. –

+0

Oh ... Programınızın niteliğinden emin değilim o zaman. Yeni bir şeyler yazdığını sanıyordum! (ilk cümlede söylediğin gibi) –

3

Küresel dökme (kalıplaştığı) operatörü, küresel atama operatörü Global dizi indis operatörü ve küresel işlev çağrısı operatör yükleme C++ izin verilmez.

MSVS C++, üzerlerinde C2801 errors üretecektir. C++ operatörleri ve bunların aşırı yüklenme kuralları için Look at wiki.

İlgili konular