对象传染媒介传染媒介

时间:2015-06-08 18:22:18

标签: c++ arrays vector segmentation-fault

使用矢量矢量我有点问题。 我班上有一个AObject *object = new Letters(); _word.push_back(object); ,我建立了自己的信息:

for (size_t i = 0 ; i < _word.size() ; ++i)  
    _word[i]->draw();

后来我用了:

std::vector<std::vector<AObject*> > _words;

^这项工作,但我需要另外一次实施

但我需要这样使用它:

在我的课堂上:AObject *obj = new Letters(); _word.push_back(obj); _words.push_back(_word);

for (size_t i = 0 ; i < _words.size() ; ++i)  
      _words[0][i]->draw();

但是我的内存损坏......

所以我不能这样使用矢量矢量:

for (size_t i = 0; i < _words.size() ; ++i)
{
  for (size_t j = 0 ; j < _word.size() ; ++j)  
        _words[i][j]->draw();
}

谢谢!

修改

我试过了:

albumsApp.controller ('albumController', function ($scope,albumFactory) {
    albumFactory.getAlbumsAsync(function(results){
        console.log('albumController async returned value');
        $scope.albums = results.albums;
    });

    $scope.changeSorting = function (){
        // your logic goes here
        console.log('changeSorting called');
    });
});

2 个答案:

答案 0 :(得分:1)

您在下面的块中错误地使用了索引:

for (size_t i = 0 ; i < _words.size() ; ++i)  
      _words[0][i]->draw();

它应该是:

for (size_t i = 0 ; i < _words.size() ; ++i)  
      _words[i][0]->draw();
//           ^^^^ reverse i and 0

答案 1 :(得分:1)

你有一个嵌套在矢量内的矢量。请注意术语嵌套。这意味着您需要某种嵌套循环来访问最内层的向量。

我们有一个简单的例子:

std::vector<std::vector<AObject*>> vect;
//...
std::vector<AObject*> inner = {new AObject, new AObject, new AObject};
//...
vect.push_back(inner);
vect.push_back(inner);
vect.push_back(inner);
vect.push_back(inner);

因此vect中有4个项目,所有这些项目都是std::vector<AObject*>,其中每个项目都有3个项目。

现在我们这样做了:

vect.size()

返回值为4,因为这是“外部”向量中的项目数。

现在,如果我们像你一样写一个循环:

for (size_t i = 0 ; i < vect.size() ; ++i)  
    vect[0][i]->draw();

您正在循环访问(如果我们展开它):

vect[0][0]->draw();  // good
vect[0][1]->draw();  // good
vect[0][2]->draw();  // good
vect[0][3]->draw();  // <-- error

问题在于没有vect[0][3]。内部向量中只有3个项目,而不是4个项目。您正在访问超出范围的内存。

所以你的指数不正确。你想做的是:

vect[0][0]->draw();  // good
vect[0][1]->draw();  // good
vect[0][2]->draw();  // good

vect[1][0]->draw();  // good
vect[1][1]->draw();  // good
vect[1][2]->draw();  // good

vect[2][0]->draw();  // good
vect[2][1]->draw();  // good
vect[2][2]->draw();  // good

vect[3][0]->draw();  // good
vect[3][1]->draw();  // good
vect[3][2]->draw();  // good

所以循环应该是这样的:

for (size_t i = 0 ; i < vect.size() ; ++i)  
{
   size_t innerSize = vect[i].size(); 
   for (size_t j = 0; j < innerSize; ++j )
      vect[i][j]->draw();
}