2013-09-28 82 views
0

我正在創建一個具有函數addClass的類,它允許用戶將A的實例添加到動態分配的數組中。將對象指針複製到動態對象數組

下面是類的代碼和一個簡單的測試:

Class.h清單

#ifndef CLASS_H 
#define CLASS_H 

#include<iostream> 

class Class { 
public: 
    Class(std::string text); 
    Class(const Class& orig); 
    virtual ~Class(); 
    Class(std::string text, Class * name, int size); 
    std::string toString(); 
    void addClass(Class * name, int size = 1); 
    Class getClass(int index); 
private: 
    Class * classArray; 
    std::string value; 
    int size; 

}; 

#endif /* CLASS_H */ 

Class.c清單

#include "Class.h" 
#include <cstdlib> 


Class::Class(std::string text) { 
    classArray = NULL; 
    value = text; 
    size = 0; 
} 

Class::Class(const Class& orig) {/*...*/} 

Class::~Class() {} 

Class::Class(std::string text, Class * name, int size){ 
    value = text; 
    this->size = size; 
    if(size == 1) 
     classArray = name; 
    else{ 
     int i; 
     classArray = (Class*)malloc(size*sizeof(Class)); 
     for(i = 0; i < size; i++){ 
      classArray[i] = name[i]; 
     } 
    } 
} 

std::string Class::toString(){ 
    return value; 
} 

void Class::addClass(Class * name, int size){ 
    int i; 
    Class * tmp = (Class*)malloc((this->size+size)*sizeof(Class)); 
    for(i = 0; i < this->size-1; i++){ 
     tmp[i] = classArray[i]; 
    } 
    if(size == 1) 
     tmp[size-1] = name[0];//assignement method is the problem!!!?? 
    else{ 
     for(i = this->size; i < this->size+size-1; i++){ 
      tmp[i] = name[i]; 
     } 
    } 
    this->size += size; 
    free(classArray); 
    classArray = tmp; 
} 

Class Class::getClass(int index){ 
    return classArray[index]; 
} 

test.c的清單

#include<iostream> 
#include "Class.h" 

using namespace std; 

int main(int argc, char** argv) { 

    Class * objectA = new Class("objectA"); 
    Class * objectB = new Class("objectB"); 

    cout << objectA->toString() << endl; 

    objectA->addClass(objectB); 
    //never gets here :'(
    cout << objectA->toString() << endl; 

    return 0; 
} 

問題是測試永遠不會通過objectA-> addClass(objectB)指令。我試圖調試,發現問題來自addClass()方法的assignement指令。我也試過memcpy它沒有工作。有沒有人有這個請求的解決方案。謝謝。

回答

1

注有確定拷貝賦值運算符Class& operator=(const Class&)。請注意,在您的代碼中,您使用複製分配(operator=)來製作課程副本,但您沒有正確實施它。

此外,在C++中,你應該更喜歡使用new[]/delete[]到C的malloc()/free(),甚至更好地只使用std::vector容器陣列。

您也可以有一個std::vector<SomeSmartPointer>(例如std::vector<std::shared_ptr<SomeClass>>std::vector<std::unique_ptr<SomeClass>>)。一般來說,考慮一些智能指針std::vector,但不要使用的擁有原始指針(std::vector<SomeClass*>)。

+0

+1,因爲你的答案比上面的方法更完整(http://stackoverflow.com/questions/19072111/copy-object-pointer-into -dynamic-object-array#answer-19072163)太糟糕了,我看到你的答案! –

+1

@PaikuHan:你應該標記爲「回答」_best_答案(無論是誰的作者,我總的來說,不只是針對這個特定的案例)。您可以更改標記的答案。 –

+0

對不起,我想你的權利,我是以自我爲中心。 StackOverflow是一個社區,最好的答案不應該是那種幫助我的人(通過我的一點搜索),而是幫助下一位程序員在同一情況下工作的人(不需要搜索解決方案的其他缺失部分) –

2

一個基本的解決方案是更喜歡newdelete而不是mallocfree。更好的解決方案是使用標準容器,如std::vector將元素保存在Class::addClass()。讓計算機負責所有內存管理;您將節省大量的開發和調試時間。

+1

嗨,我想到了這一點,事實上我想我會使用該解決方案,因爲它似乎是唯一的最佳選擇。但是我真的很想知道如何在不使用std :: vector的情況下解決這個問題,所以我更瞭解C/C++的工作原理。 –

+1

你可以探索'vector'標準頭文件的結構,這將幫助你理解C++使用new和delete的方式,它們是如何使用的,而不是'malloc'和'free',還有使用後者的情況。簽出'list'標準頭。 –

3

不要在C++對象上使用malloc,使用new和new []並刪除和刪除[]。 C++中malloc的問題在於它不會爲您的對象調用構造函數,而free不會調用析構函數。新建,新建[],刪除和刪除[]。你會因爲分配給未構造的對象而崩潰,並且因爲沒有使用新的對象而得到該對象。

不是說這是你的代碼唯一的問題,但它是最明顯的問題。在你的代碼中定義的自定義拷貝構造函數Class(const Class&)爲您的類,但你似乎

+0

這是我真正期待的棘手答案。我應該像C64先生一樣添加(在下面的答案),重載分配運算符將是必要的(在我的代碼中),這樣才能正常工作。 –

+0

此外默認的構造函數是必要的,它似乎執行一個新的[]操作 –