2012-03-22 32 views
5

vector<unsigned char> numaralı telefonu alan ve const char * numaralı telefona geri döndüren bir birim test sınıfı için küçük bir yardımcı işlev geliştirdim. Bunu yazdım, böylece basit karşılaştırmalar için gtest'in ASSERT_STREQ makrosuna iletebilirim.C++ işlev dönen const karakter *

const char * convertVecToChar(std::vector<unsigned char>& source) 
{ 
    std::vector<unsigned char>::size_type size = source.size(); 
    char* data = (char*)malloc(sizeof(char) * (size + 1)); 
    memcpy(data, &source[0], size); 
    data[size] = 0; 
    return data; 
} 

Ve işte çağrıldığını bir örnek: İşte burada

ASSERT_STREQ("de", convertVecToChar(somevector)); 

ben daha yolda delete uğramadan malloc çağırarak, ama kulüpler olarak bu ancak sızdıran olduğunu tahmin?

Bunu yapmanın daha zarif bir yolu var, bu da bir ASSERT_STREQ numaralı çağrıyı her test için ayrı bir const char * değişkeni oluşturmayı içermiyor mu?

Tüm yanıtlar için şimdiden teşekkür ederiz.

Chris

+1

Kullanım 'free()' malloc 'sonra()' değil, 'delete'. İlginç bir soru için – hmjd

+0

+1. Yine de bir cevabım yok. Bu sadece birim testi için dev bir hack gibi görünüyor. Bir ASSERT_VECEQ oluşturmayı düşündünüz mü? Ayrıca, ünite testlerinde hafıza sızıntılarına fazla önem vermemelisiniz. –

+0

Tamam, bana bildirdiğiniz için teşekkürler. –

cevap

11

dönmek yerine std::string bir char* (malloc() veya new, unrequired):

std::string convertVecToChar(std::vector<unsigned char>& source) 
{ 
    return std::string(source.begin(), source.end()); 
} 

ve kullanım: Sadece string konteyner kullanmalıdır

ASSERT_STREQ("de", convertVecToChar(somevector).c_str()); 
+1

Bu, sağduyulu yaklaşım gibi görünüyor :) Teşekkürler! –

1

- hayır bellek sızıntıları hakkında endişelenmeniz gerekir.

BTW - C++ kullanırken - sadece new ve delete dizinine yapıştırın.

0

Std :: string'i de kullanmanızı tavsiye edecektim, ama merak ettim, neden sadece vektörün içeriğini karşılaştırmıyorsunuz? Sen &source[0] yoluyla ham verilere erişebilir, bu nedenle yapabilirdi:

bool operator==(const char* nullTerminatedChars, 
       const std::vector<char>& vecChars) 
{ 
    return std::string(nullTerminatedChars) == 
      std::string(vecChars.begin(), vecChars.end()); 
} 

Kullanımı için:

std::vector<char> chars; 
ASSERT_EQ("de", chars); 

Sen'

ASSERT_STREQ("de", (char*)&source[0]); 
+1

Bunu denedim, ancak sınama başarısız oldu - 'ASSERT_STREQ (" de ", (const char *) & ret [0])" - bunun nedeni, vektörün sonunda bir byte 0 olmamasıdır. –

+0

@MrChris: Evet, bunu düşünmedim – MikMik

2

Aşırı yük operator==, o zaman sadece ASSERT_EQ kullanabilirsiniz GoogleTest'in, iddiaların başarısız olması durumunda argümanları hata iletilerine dönüştürmek için kullandığı için operator<<(std::ostream& ... numaralı telefonu aşırı yüklemesi gerekir.

düzenleme:

std::ostream& operator<<(std::ostream& os, const std::vector<char>& chars) 
{ 
    return os << std::string(chars.begin(), chars.end()); 
} 
+0

Bunu beğendim - çok zarif görünüyor. Fakat aşırı yüklenmeyi düzgün bir şekilde nasıl uygulayacağınıza dair ödevlere ihtiyacımız var! (Hala bu konuda bir n00b biraz). Önerin için teşekkürler. –

1
source.push_back(0); 
ASSERT_STREQ("de", (char*)&source[0]); 
source.pop_back();