2016-12-01 81 views
0

我一直在處理一個處理電話目錄的項目。我的程序從數據表中讀取數據並創建一系列電話。創建和訪問類對象的動態數組

我有2個課程:軟電話和車隊。

Softphone包含電話(私人)的所有值以及獲取/設置和打印功能以訪問它們(公共)。

class softphone { 

public: 
    string name; 
    //All my other variables 

public: 
    softphone(); 
    softphone(const softphone &obj); 
    ~softphone(); 
    //Get functions 
    string get_name(); 
    //ect 
    //Set functions 
    void set_name(string); 
    //ect 
    //Print functions 
    void print_name(); 
    //ect 
} 

艦隊包含電話和輸出操作功能的陣列

class fleet { 

private: 
    //Some variables and buffers 

    softphone* phone; ->This is the array containing all the phones 


public: 

//Read file and create array functions 

//Functions 
void print_fleet(); 
    //More output functions 

}; 

的車隊類都有一個指針指向軟電話和我用它來動態地創建電話的陣列。它通過從文件中讀取目錄來創建數組。 (我不知道在運行時之前多少個電話。)

它計算文件中的行數,然後創建和數組大到足以容納所有的數據:

phone = new softphone[number_of_lines - 1]; //Line 1 is header 

它從讀文件,使用設置的功能保存數據,然後使用 phone ++增加指針;

到目前爲止這麼好。現在,如果我想訪問這些電話並呼叫成員功能。

phone[0].print_name(); 

編譯器給了我沒有錯誤,但輸出是垃圾(在屏幕上無限隨機字符)。我會在內存位置異常一個std :: bad_alloc的。

for(int i = 0; i < (number_of_lines - 1); i++){ 
    phone-- 
} 
phone->print_name(); 

現在它工作。這樣我可以訪問所有的手機並打印出來。所有的數據都在那裏。但我必須增加/減少指針,我不能使用索引號。

如何使用此索引編號?當我使用它時爲什麼電腦會變得瘋狂,但當我增加時很好?

感謝您的回覆,

+1

請**用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http://sscce.org)**你的問題 – NathanOliver

+2

這是另一個「我可以'使用'std :: vector'「要求?如果沒有,'std :: vector 電話;'和溝指針。另外,你的'softphone'類不需要用戶定義的拷貝構造函數或析構函數 - 編譯器的默認版本可以很好地工作。 – PaulMcKenzie

回答

0

當您創建數組時,手機指向第一個元素。之後,你開始增加指針,直到你到達數組的末尾。那時,手機不再指向陣列的開始。然後,你運行你的循環,通過指針返回,直到它回到開頭,然後事情再次開始工作。我建議你停止使用指針算術,只使用索引。然後,您可以放心,手機始終指向陣列的開始。或者,你可以分配一個不同的變量,並用它來指針來填充數組。或者,您可以使用@PaulMcKenzie建議的std :: vector。

+0

使用這樣的指標? phone [0] .print_name(); – Gabriel

+0

是的。但是,當您首先創建數據時,您應該只使用索引而不是指針算術。你說你這樣做:「它從文件讀取,用設置的函數保存數據,然後使用phone ++遞增指針;」相反,通過電話陣列循環,但使用手機[我],而不是phone ++。直到你更清楚增量指針會做什麼,並且你知道你在代碼中需要一些額外的速度,使用索引更簡單和更清晰。我很少發現自己需要使用指針算術。 – wandercoder

+0

它編譯但它不工作,我的問題的整個點。我得到垃圾輸出。但是,如果我增加指針並調用它的作用相同的功能。這就是我不明白 – Gabriel