从类到模板C++
C++ from Class to Template
编辑:确实(*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 进行了一些研究后,我意识到是的,这是一个模板。让我们做一个模板。我有点做到了。标头和实现在一个大文件中,无处不在..但该项目开始破裂。
在将类转换为模板之后,它也不起作用。所以我开始到处添加template <typename T>
,直到红线消失。它没有。
以下是我所做的更改: https://github.com/screws0ft/ubisoft/commit/1b2bd6f9d5d66fcc9315f7a03cc71a2d6f64d57e
那么问题出在哪里呢?有人可以帮助我吗?
欣赏它!
但是(*it)->print()
应该可以工作。
但是,您也可以间接执行此操作:
std::vector<CItem*>::iterator it;
for ( it = this->_items.begin(); it != this->_items.end(); ++it)
{
CItem *item = *it;
item->print();
}
如果这些都不起作用。你在其他地方有问题。是否正确分配了CItem
对象?...
快速而肮脏的方式:
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;
}
- 没有找到相关文章