从类到模板C++

C++ from Class to Template

本文关键字:C++      更新时间:2023-10-16

编辑:确实(*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;
}
相关文章:
  • 没有找到相关文章