2012-04-05 18 views
0

これらのベクトルのデータをテキストファイルに書き込もうとしています。コードを実行すると、実行時エラーが返されます。 Category,Product,Cart,CustomerおよびAddressはすべてstructであり、それぞれget_memberが返されます。ベクトルイテレータは逆参照できません(ベクトル内のベクトル)

ofstream write_cats; 
    write_cats.open("catprd.dat", ios::out, ios::trunc); 
    vector<Category>::iterator i; 
    write_cats << cats.size() << endl; 
    for (i = cats.begin(); i < cats.end(); i++) { 
     write_cats << i -> get_catid() << '\t'; 
     } 
    vector<Product>::iterator j; 
    write_cats << prods.size() << endl; 
    for (j = prods.begin(); j < prods.end(); j++) { 
     write_cats << j -> get_prodid() << '\t'; 
     write_cats << j -> get_prodprice() << endl; 
     } 
    write_cats.close(); 

    ofstream write_carts; 
    write_carts.open("carts.dat", ios::out, ios::trunc); 
    vector<Cart>::iterator k; 
    write_carts << carts.size() << endl; 
    for (k = carts.begin(); k < carts.end(); k++) { 
     write_carts << k -> get_cartid() << '\t'; 
     write_carts << k -> get_day() << endl; 
     } 
    vector<Cart_item>::iterator l; 
    write_carts << cart_items.size() << endl; 
    for (l = cart_items.begin(); l < cart_items.end(); l++) { 
     write_carts << l -> get_cartitemid() << '\t'; 
     write_carts << l -> get_qty() << endl; 
     } 
    write_carts.close(); 

    ofstream write_custs; 
    write_custs.open("custs.dat", ios::out, ios::trunc); 
    vector<Customer>::iterator m; 
    vector<Address>::iterator n; 
    write_custs << custs.size() << endl; 
    for (m = custs.begin(); m < custs.end(); m++) { 
     write_custs << m -> get_cust_id() << '\t'; 
     write_custs << n -> get_zip_code() << endl; 
     } 
    write_custs.close(); 

戻り値は、ここで "dereferencableベクトルイテレータではない"

を時間エラーを実行struct Addressがどのように見えるかです:

using namespace std; 
#pragma once 
#include <string> 

struct Address { 

public: 

int get_st_number() const{return st_number;} 
int get_zip_code() const{return zip_code;} 
string get_st_name() const{return st_name;} 



Address(){}         
Address (int num, string name, int zip) 
    : st_number(num), st_name(name), zip_code(zip) {} 

private: 
int st_number; 
int zip_code; 
string st_name; 


}; 

struct Customer

struct Customer { 
public: 

Address get_address() const{return addr;} 
int get_cust_id() const{return cust_id;} customer id 
string get_name() const{return cust_name;} 
Customer (int id, string n, Address a) 
    : cust_id(id), cust_name(n), addr(a) {} 


string display_addr() const { 
    std::cout<<setw(15)<<cust_name<<" "; 
    std::cout<<setw(15)<<cust_id<<" "; 

    return string(); 
} 



private: 

int cust_id; 
string cust_name; 
Address addr;   
}; 
+2

ようこそStackOverflow。コードフラグメントが長すぎて短すぎます。それはあまりにも長く、人々が理解するためにあまりにも無関係なgooでいっぱいです。それはまた短すぎる。コンパイルするのに必要な鍵を紛失しています。あなたが持っている問題を示す**短い**、**完全な**プログラムを作成してください。詳細はhttp://sscce.orgを参照してください。 –

答えて

3

あなたがvector<Address>::iterator n; を初期化することを忘れ

+0

ベクトルのすぐ下にあります :: iterator m; forループ内でイテレータmを意味する場合を除きますか?コードはどのように見えますか? – ignacio

+0

@ user1314967:あなたはそれを宣言しますが、 'm = custs.begin()'で 'm'と同じように、有効な(参照不可能な)値を与えてはいけません。 –

+0

@MikeSeymourもし 'struct Customer'と' struct Address'の両方に 'm'を使用すると' Address'のメンバーが 'Customer'の一部ではないことがわかります。私は 'Address get_address()const {return addr;} 'を通して' Customer'の 'Address'に到達しようとしますが、' int'の 'st_number'のような' Address'のメンバーを呼び出すことはできません'アドレス'は 'int get_stnum(){return st_number; } ' – ignacio

1

反復子nを宣言していますが、逆参照できない値に初期化していません。あなたのアップデートから、顧客に関連付けられたAddressを印刷するように見えます。あなたはむしろ別のイテレータよりも、mによって参照される顧客経由でアクセスしたい:

write_custs << m -> get_cust_id() << '\t'; 
write_custs << m -> get_address().get_zip_code() << endl; 

また、それは、そのループ内の範囲には、各イテレータは良い考えかもしれません。それはあまりエラーが発生しやすい外側のスコープにするたびに新しいものを宣言するよりもです:

for (vector<Whatever>::const_iterator i = stuff.begin(); i != stuff.end(); ++i) { 
    // do stuff with "i" 
} 
// "i" is no longer available - no danger of accidentally using it again. 

そして、他のポイントのカップル:

  • あなたはend()イテレータと比較するという<よりも!=を使用する必要があります;一部のタイプのイテレータでは<は機能しません。
  • endlではなく、改行を'\n'としてファイルに書き込む必要があります。 endlはファイルバッファをフラッシュし、その時点でファイルを強制的にディスクに書き込むため、非常に遅くなる可能性があります。
+0

すごく、私はそれらの変更を行います。私は数ヶ月ほどC++を学んできました。 – ignacio

関連する問題