2016-12-01 9 views
0

私は電話ディレクトリを扱うプロジェクトに取り組んできました。私のプログラムは、データシートからデータを読み込み、電話機の配列を作成します。クラスオブジェクトの動的配列の作成とアクセス

私は2つのクラスを持っています:ソフトフォンとフリート。

Softphoneには、電話機(プライベート)のすべての値と、それらにアクセスするためのget/setおよびprint関数(public)が含まれています。

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(ショート、自己完結型、正しい例)](http://sscce.org) – NathanOliver

+2

あなたの質問は別のものになりますか? 'std :: vector'を使う必要はありませんか?そうでなければ、 'std :: vector phone;'とポインタを捨てます。また、 'softphone'クラスはユーザ定義のコピーコンストラクタやデストラクタを必要としません。コンパイラのデフォルトバージョンは完全にうまく動作します。 – PaulMcKenzie

答えて

0

電話機は、最初の要素を指しています。その後、配列の最後までポインタをインクリメントし始めます。その時点で、電話機はもはやアレイの先頭を指さなくなります。次に、ポインタが戻ってくるまでループを実行して、作業が再び始まるようにします。ポインタの算術演算をやめ、インデックスだけを使うことをお勧めします。次に、電話機は常に配列の先頭を指していることが保証されます。または、別の変数を代入してポインタに使用して配列を埋めることもできます。あるいは、@ PaulMcKenzieが提案したように、std :: vectorを使うことができます。

+0

このようなインデックスを使用しますか? phone [0] .print_name(); – Gabriel

+0

はい。しかし、最初にデータを作成するときにも、ポインタ算術の代わりにインデックスを使用するだけです。"ファイルから読み込み、設定された関数でデータを保存してから、ポインタをphone ++でインクリメントします;"代わりにphone配列をループしますが、phone ++ではなくphone [i]を使用してください。インクリメンタルポインタが何を行うかを明確にし、そのコードで余分な速度が必要であることが分かっているときは、インデックスを使用する方が簡単で分かりやすくなります。私はめったにポインタ計算を使う必要があるとは思っていませんでした。 – wandercoder

+0

それはコンパイルされますが、私の質問の全体的なポイントは動作しません。私はガベージの出力を得る。しかし、私はポインタをインクリメントし、同じ関数を呼び出す場合、それは動作します。それは私が理解していないことです。 – Gabriel

関連する問題