-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!!
}

好的..所以它没有工作。在对 std::vector 做了一些研究之后,我意识到是的,那是一个模板。让我们做一个模板。我确实做到了。头文件和实现在一个大文件中,无处不在..但项目开始中断。

在将 Class 转换为 Template 之后,它也不起作用。所以我开始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 回答