2012-08-20 13 views
6

İmzalı olan ve başka bir diziden bazı verileri depolamak üzere yeniden tahsis edilen imzasız char işaretçisine sahip bir sınıfım var. Bu Ben bu kod sevmiyorum bir fonksiyonuBir ham dizideki memcpy eşdeğerini std :: vektörüne nasıl yapabilirim?

class MyClass { 
    private: 
     unsigned char* m_Buffer; 
     int m_BufferSize; 
    public: 
     bool SetBuffer(int iSize, const unsigned char* pArray); 
}; 

bool MyClass::SetBuffer(int iSize, const unsigned char* pArray) { 
    bool bOK = false; 
    if (pArray != NULL && iSize > 0) { 
     delete [] m_Buffer; 
     m_Buffer = new unsigned char[iSize]; 
     memcpy(m_Buffer,pArray,iSize); 
     m_BufferSize = iSize; 
     bOK = true; 
     } 
     return bOK; 
    } 

ile yapılır ve gerçekten bir std::vector<unsigned char> ile işaretçi değiştirmek istiyoruz. Sorum şu, memcpy özelliğini nasıl uygularım? Bir vektörü işlevimin argümanı olarak geçiriyorsam, yineleyicileri kullanarak kopyalayabilirdim, ancak parametre argümanı türü üzerinde hiçbir kontrolüm yok, bu yüzden unsigned char* ile sıkışıp kaldım. Yineleyicileri kullanmanın veya vektörü doğru boyuta sığdırmanın ve sonra iç dizisine erişmenin bir yolu var mı? Böylece verileri memcpy ile kopyalayabilir miyim? Ya da yineleyiciler kullanarak daha iyi bir şey? Bir döngü ve push_back kullanabileceğimi biliyorum ama bu bana acı vericidir. Herhangi bir öneri minnetle alınacaktır.

cevap

19

Aslında, yineleyiciler işaretçilerden modellenir ve bu nedenle bir dizi içindeki işaretçiler RandomAccessIterator konseptini uygulamak için kabul edilir. Bu nedenle

:

m_buffer.assign(pArray, pArray + Size); 
+0

+1 En iyi çözüm –

+0

Bu otomatik olarak vektörü yeniden boyutlandıracak mı yoksa net olarak çağırmalı ve boyutunu dizinin boyutuna göre ayarlamalı mıyım? – mathematician1975

+0

@ mathematician1975 bakınız [burada] (http://en.cppreference.com/w/cpp/container/vector/assign). Net, yeniden boyutlandırmak veya herhangi bir şey aramak zorunda değilsiniz. – juanchopanza

0

Gerçekten çiğ işaretçiler bu şekilde önlemek için tavsiye. Ben ham işaretçiler yerine std :: vectors yönetmek için daha iyi bir fikir olduğunu düşünüyorum.

MyClass::MyClass(const MyClass &Class) { 
    m_BufferSize = Class.m_BufferSize; 
    m_Buffer = new new unsigned char[m_BufferSize]; 
    memcpy(m_Buffer, Class.m_Buffer, m_BufferSize); 
} 

MyClass::operator =(const MyClass &Class) { 
    if (m_Buffer) delete [] m_Buffer; 
    m_BufferSize = Class.m_BufferSize; 
    m_Buffer = new new unsigned char[m_BufferSize]; 
    memcpy(m_Buffer, Class.m_Buffer, m_BufferSize); 
} 

sence de ise:

class MyClass { 
private: 
    std::vector<unsigned char> m_Buffer; 
    // No size member is needed, it is stored in m_Buffer 
public: 
    // No size parameter is needed, it is stored in Array 
    void SetBuffer(const std::vector<unsigned char> &Array); 
}; 

void MyClass::SetBuffer(const std::vector<unsigned char> &Array) { 
    std::copy(Array.begin(), Array.end(), m_Buffer.begin()); 
} 

sizin dessing kuvvetleri Eğer kopya yapıcılar ve operator = bu pointer ilgilenir (ya da bunun yerine ondan kurtulmak) MyClass için ham yönetilen olması varsayarsak Kopya oluşturucudaki MyClass yönetilen işaretçilere ve operator ='a iyi bakmayın, aynı belleği yöneten iki örnek MyClass ile sona ereceksiniz.

+1

Soru, geçerli işaretçiyi dizinin + boyutuna bir 'vektör' ile değiştirmeyle ilgilidir. –

+0

Evet, ilan ettikten sonra farkettim. Ama sonuçta, tavsiye aynı, bence daha iyi 'std :: vector' yerine ham işaretçiler kullanıyoruz. –

İlgili konular