2013-12-16 100 views
-1

更新:類的構造函數與結構數組(直接)

我看到IM導致這裏多的混亂,SRY比賽的傢伙..感謝羅馬與載體^^

clarifing我的問題的想法:我想通過傳遞整數作爲參數(我不想爲dem數組創建全局或局部變量)並將它們複製到類成員中,從而將結構數組straigth放入創建的類中(在main()中)

問題是我的班級初始化失敗,我的嘗試:

struct _Note 
{ 
    int nFrequenz; 
    int nTakt; 
}; 

class _Chart 
{ 
public: 
    _Chart(std::vector<_Note> vNotes) 
    { 
     for(int i = 0; i < vNotes.size(); i++) 
      this->_chart.push_back(vNotes[i]); 
    } 

private: 
    std::vector<_Note> _chart; 
}; 

void main() 
{ 
    _Chart x(
     { {1,2}, {2,3} } 
    ); 
    // not working, wrong initialization 
    // still confused about the brackets ^^ 

    getchar(); 
} 
+1

你有什麼期望'的sizeof(P)'是沒有爲指定數組的長度???最好使用'std :: vector'來解決這個問題。 –

+0

我會嘗試使參數類型爲'klasse'常量,並嘗試使用賦值運算符而不是()。 – woolstar

+0

'main()'返回'int',而不是'void'。此外,以下劃線開頭的名稱後跟一個大寫字符的名稱將保留給實現(編譯器和標準庫)。 –

回答

2

當作爲參數struktur p[]衰變傳遞給指針(類似於struktur* p)。這個指針的大小絕對不會是你在確定元素數量時所要查找的。

相反,爲什麼不提供類似於標準容器的兩個迭代器構造函數?

+0

yes,'sizeof(p)== sizeof(uintptr_t)'這對x86機​​器來說是4 – Netherwire

0

數組在傳遞時衰減爲指針。所以,你必須傳遞數組中元素的數量作爲函數的附加參數。但是,在這種情況下,您有一個選項。

glob定義移至klasse聲明之上。然後在構造函數中,您應該能夠通過sizeof(glob)/sizeof(struktur);獲得對象的數量。你應該能夠動態分配並在那裏做一個智能成員複製。

0

爲什麼不使用std :: vector容器模板?

class klasse 
{ 
public: 
    klasse(std::vector<struktur>& strs) 
    { 
     _chart = new struktur[strs.size()]; 
     for(int i = 0; i < strs.size(); i++) 
     { 
      this->_chart[i] = strs[i]; 
     } 
    } 

private: 
    struktur* _chart; 
}; 

而且在main():

void main() 
{ 
    std::vector<struktur> myStructs; 

    myStruct.push_back(glob[0]); 
    myStruct.push_back(glob[1]); 
    myStruct.push_back(glob[2]); 

    klasse y(myStructs); 
    getchar(); 
} 

這是簡單而優雅。

[UPD]是的,在這裏你的榜樣sizeof(p)將等於sizeof(uintptr_t),因爲p是一個指針類型。

+0

爲什麼不在第一個地方使用'std :: vector'作爲成員? –

+0

嗯,是的。但問題是「如何初始化」,我剛纔展示瞭如何。 std :: vector作爲成員,std :: copy這也沒問題。 – Netherwire

2

您需要通過元算過:

klasse(struktur p[], size_t count) 
{ 
    _chart = new struktur[count]; 
    // copy array in one shot as no deep copy is needed here. 
    memcpy(_chart, p, count * sizeof(struktur)); 
}