在对象内填充列表并在以后访问它

时间:2012-05-09 19:05:38

标签: c++ list c++11 openframeworks

如果标题不是很明确,我很抱歉,但我会尝试更好地解释它。我对c ++不太熟悉,而且我第一次使用openFrameworks。我正在尝试做一些可能很容易的事情,至少在其他语言中是这样,但我无法做到:(

我有一个视频类,在其中我有一个对象list<ofImage> keyFrames;和几个与之交互的方法,如下所示:

void addKeyFrame(ofImage img) {
    if(keyFrames.size() == 0) {
        keyFrames.push_front(img);
    }
    else {
        keyFrames.push_back(img);
    }
}

list<ofImage> * getKeyFrames() {
    list<ofImage> *list = &keyFrames;
    return list;
}

void clearKeyFrames() {
    keyFrames.clear();
}

在其他类中我有几个Video对象,我有一个函数使用addKeyFrame(ofImage img)来填充每个对象的列表。在该函数的最后,如果我打印列表大小,它大于零。

draw()函数内部迭代每个Video对象,我尝试在keyFrame列表中绘制每个图像,但列表总是空的,我只是用图像填充它...我正在使用{{1函数返回指向列表的指针。如果我只是在另一个函数中添加对象并且如果我确认大小大于零,它怎么可能是空的?如果我尝试调试应用程序,我觉得更失去大声笑。

如果您需要更多信息,请告诉我,如果您知道我做错了什么。谢谢!

1 个答案:

答案 0 :(得分:0)

好的,一些小事:

1-您不应该检查空列表(或任何其他STL容器),如下所示:

if(keyFrames.size() == 0)

这更快,更“时尚”:

if(keyFrames.empty())

2-你在这里创建了一个不必要的变量:

list<ofImage> * getKeyFrames() {
    list<ofImage> *list = &keyFrames;
    return list;
}

你可以做到:

list<ofImage> * getKeyFrames() {
    return &keyFrames;
}

3-指针不是(大多数时候)C ++中最好的解决方案。引用是最常用的替换,但如果返回迭代器,它在htis情况下会更好:

list<ofImage>::iterator GetBeginIterator() {
    return keyFrames.begin();
}

这样你可以像指针一样使用迭代器,增加它来迭代帧并解除引用它(用*运算符)......