-1

編集:確かに(*it)->print()動作します。誤解を招く情報をお詫び申し上げます。私が質問を書いたとき、私はすべての可能性を試したと思いました。そして最後のものは、私がそれを試していなかったとしても、それは私には間違っているように見えました-ポインタへのポインタ。

お時間をいただきありがとうございました。初心者のミスでしたが、光が見えました!

私は一週間前に小さなプロジェクトを始めました。this->_items私がこのコードを入手するまで、すべてがスムーズに機能しました。std::vector<CItem*> _items;

std::vector<CItem*>::iterator it;
for ( it = this->_items.begin(); it != this->_items.end(); ++it)
{
    //MUST use .print() for each Item.
    //so:
    //it->print() - nope
    //(*it).print() -nope - same thing.. STILL!!! What's the problem?
    //it.print() - maybe?
    //(*it)->print() - come onn!!
}

OK..それでうまくいきませんでした。std :: vectorの調査を行った後、私はそうだと気づきました。それはテンプレートです。テンプレートを作ってみましょう。そして、私はちょっとしました。ヘッダーと実装が1つの大きなファイルにあり、どこにでもあります。しかし、プロジェクトは壊れ始めました。

クラスをテンプレートに変換した後も機能しませんでした。それでtemplate <typename T>、赤い線が消えるまで、どこにでも追加し始めました。そうではありません。

これが私が行った変更です:https ://github.com/screws0ft/ubisoft/commit/1b2bd6f9d5d66fcc9315f7a03cc71a2d6f64d57e

では、どこに問題があるのでしょうか。誰かが私を助けてくれますか?

感謝します!

4

2 に答える 2

2

ただし(*it)->print()、動作するはずです。

ただし、間接的に行うこともできます。

std::vector<CItem*>::iterator it;
for ( it = this->_items.begin(); it != this->_items.end(); ++it)
{
    CItem *item = *it;
    item->print();
}

それらのどれも機能しない場合。他の場所で問題が発生しています。CItemオブジェクトを正しく割り当てましたか?..。

于 2013-02-01T18:38:48.250 に答える
2

迅速で汚い方法:

for (auto &p : _items)
    p->print();

正しい方法:次のprintようなものに変更します。

std::ostream &print(std::ostream &os) { 
    // print self onto os
    return os;
}

次に、次のoperator<<ようなものを定義します。

std::ostream &operator<<(std::ostream &os, item const &i) { 
    return i->print(os);
}

...そして最後に次のようなもので印刷を行います:

std::copy(begin(items), end(items), std::ostream_iterator<item>(std::cout, "\n"));

ああ、そして上に示したように、あなたは本当にの代わりにitems(またはおそらく)を使いたいのです。技術的には、このコンテキストでは許容されますが、許可されるコンテキストには多少の制約があるため、通常、先頭にアンダースコアを付けて名前を定義しないことをお勧めします。items__items_items

編集:クイックバージョンとダーティバージョンの短いデモ:

#include <iostream>
#include <vector>

class item { 
    int i;
public:
    std::ostream &print(std::ostream &os) {
        return os << i;
    }

    item(int i) : i(i) {}
};

class whatever { 
    std::vector<item *> items;
public:
    void print_all() { 
        for (auto &i : items)
            i->print(std::cout);
    }

    whatever() { 
        for (int i=0; i<10; i++)
            items.push_back(new item(i));
    }
};

int main() { 
    whatever w;

    w.print_all();
    return 0;
}
于 2013-02-01T18:44:08.737 に答える