0

私の問題は、基本クラスと 3 つの子クラスがあり、3 つの子クラスすべての代表であるすべての要素を配置できるベクトルを作成したかったことです。ファイルからの読み込みを処理するコードの一部を次に示します。

vector<Robot*> robots;
vector<Mac> mac;
vector<Eco> eco;
vector<Pro> pro;
vector<int> charge;
vector<int> deliver;

try {
    string s;
    ifstream f;

    do {
        cout << "Add meg a filenevet" << endl;
        cin >> s;
        f.open(s.c_str());
    } while (!f.good());

    cout << "adatok beolvasasa..." << endl;

    int napok;
    if (!(f >> napok)) throw 1;
    charge.resize(napok);
    deliver.resize(napok);

    for (int i = 0; i<napok; i++) {
        if (!(f>>charge[i])) throw 1;
        if (!(f>>deliver[i])) throw 1;
    }

    string type, name;
    int battery;
    int m = 0; int e = 0; int p = 0;
    std::string line;
    while (std::getline(f, line)) {
      stringstream ss(line);
      if (ss >> type && ss >> name && ss >> battery) {

            if (type=="Mac") {
                cout << "mac" << endl;
                Mac r = Mac(name,battery);
                mac.push_back(r);
                robots.push_back(&mac[m]);
                m++;
            };
            if (type=="Eco") {
                cout << "eco" << endl;
                Eco r = Eco(name,battery);
                eco.push_back(r);
                robots.push_back(&eco[e]);
                e++;
            }
            if (type=="Pro") {
                cout << "pro" << endl;
                Pro r = Pro(name,battery);
                pro.push_back(r);
                robots.push_back(&pro[p]);
                p++;
            };
        }
    }

これはこれまでのところ機能し、コンパイルして実行しますが、関数 ex にアクセスしようとするとrobots[i].getBattery(); プログラムがフリーズします。ポインターがどこにも向いていないようですが、その理由はわかりません:(

4

1 に答える 1

1

問題は、オブジェクトにアクセスするための 2 つの独立した方法があり、2 つの間の同期がないことです。

アイテムをベクターにプッシュしてからそのアイテムへのポインターを取得する場合、そのポインターは、ベクターのストレージが移動または無効化されていない場合にのみ有効です。あなたの場合、 push_back() 呼び出しが繰り返されると、ベクトルの再割り当てがトリガーされる可能性があり、これがその場で発生することが保証されていないため、要素が新しいメモリ位置に移動する可能性がありますが、明らかにポインターは更新されません。したがって、どこにもポインタがありません。

データを保持するコンテナのセットと、そのデータへのポインタを保持するだけの別のコンテナを持つことは、私にはかなり悪い設計のように見えます。私が見ているように、コードを改善し、発生している問題を修正するには、2 つのオプションがあります。どちらの場合も、ポリモーフィック要素へのポインターを保持するために必要なコンテナーは 1 つだけです。コンテナーを宣言する方法は次のとおりです。

1) a を使用しboost::ptr_vectorて、多態性オブジェクトへのポインターを格納します。このコンテナーは、ポインターを保持するように設計されており (そうでstd::vectorはなく、後者には値のセマンティクスがあります)、そこに含まれるオブジェクトの有効期間を管理します。

2) ブーストを使用できない場合は、aを使用std::vector<std::shared_ptr<Robot> >して多態性オブジェクトへのポインターを保持します。

どちらの場合も、項目を値で保持するコンテナーを廃止し、if ステートメントでオブジェクトをヒープに割り当ててから、ポインターをコンテナーに配置します。

于 2013-01-02T20:48:58.223 に答える