调整对象矢量大小时出错

Posted

技术标签:

【中文标题】调整对象矢量大小时出错【英文标题】:Error when resizing vector of object 【发布时间】:2014-12-31 22:37:47 【问题描述】:

我正在尝试创建一个对象向量,但我遇到了一些问题。我不能将超过 19 个对象 push_back 到我的向量,因为它显示了 bad_alloc 的错误消息。

我尝试使用 resize() 或 reserve() 来调整向量的大小,但仍然没有。

对于 resize(),我读到您需要提供 2 个参数来调整向量的大小。但仍然没有。 当我尝试在没有 push_back 的情况下使用它时,它会显示错误:')' 标记之前的预期主表达式。

#define N 10 //ari8mos seirwn tou xarth
#define M 10 //ari8mos sthlwn tou xarth
#define TREAS 100//posothta 8usaurou
#define PORTS 100//ari8mos limaniwn
extern void ships(map (&myArray)[N][M], vector<ship> &myShips);

void ships(map (&myArray)[N][M], vector<ship> &myShips)

  int i,j,y;

  srand ( time(NULL) );
  //myShips.reserve(21);
  //myShips.resize(20,ship);
  cout << myShips.capacity() << endl;
  int x=0;
  for( i = 0; i <19 ; i++)
      myShips.push_back(pirate(rand() % N,rand() % M,100,100,100,1,'@',myArray,myShips));
  
  for( i=0;i<myShips.size();i++ )
      cout << myShips[i].get_symbol() << " ";
  


以下是帮助您理解的其余代码:

  class ship

   protected:
    int i,j,x2,y2;
    //vector<vector<map> > myArray;
    //ship (&myShips)[N][M];
    int x;
    int y;
    map (myArray)[N][M];
    vector<ship> myShips;
    int max_resistance;
    int current_resistance;
    int speed;
    int reserve_treasure;
    char symbol;

   public:
    ship(int x_, int y_, int max_res, int cur_res, int res_treas, int sp, char sy, map (&myArr)[N]     [M], vector<ship> &Ship)
        :x(x_)
        ,y(y_)
        ,max_resistance(max_res)
        ,current_resistance(cur_res)
        ,reserve_treasure(res_treas)
        ,speed(sp)
        ,symbol(sy)
        ,myArray(myArr)
        ,myShips(Ship)
    cout << "eimai o 'ship' 2" << endl; 
     ~ship() 
    int get_x();
    int get_y();
    float get_max_resistance();
    float get_current_resistance();
    int get_speed();
    float get_reserve_treasure();
    char get_symbol();
    void set_x(int pos_x);
    void set_y(int pos_y);
    void set_max_resistance(float maxres);
    void set_current_resistance(float curres);
    void set_speed(int sp);
    void set_reserve_treasure(float restrea);
    void set_symbol(char sy);

    void movement();
    void operation();
;
int ship::get_x()
    return x;

int ship::get_y()
    return y;

float  ship::get_max_resistance()
    return  max_resistance;

float ship::get_current_resistance()
    return current_resistance;

int ship::get_speed()
    return speed;

float ship::get_reserve_treasure()
    return reserve_treasure;

char ship::get_symbol()
    return symbol;


void ship::set_x(int pos_x)
    x = pos_x;

void ship::set_y(int pos_y)
    y = pos_y;

void ship::set_max_resistance(float maxres)
    max_resistance = maxres;

void ship::set_speed(int sp)
    speed = sp;

void ship::set_current_resistance(float curres)
    current_resistance = curres;

void ship::set_reserve_treasure(float restrea)
    reserve_treasure = restrea;

void ship::set_symbol(char sy)
    symbol = sy;


class pirate : public ship


   public:

    pirate(int posx, int posy, float mr, float cr, float rt, int spe, char sym, map (&Array)[N] [M],vector<ship> &Ship ):ship(posx,posy,mr,cr,rt,spe,sym,Array,Ship)
cout << "eimai o 'pirate' 1" << endl;


    // ship(90,90,1,50,'@',Array,Ship) //vector<vector<map> > Array, vector<vector<ship> > Ship)     
;

希望你能帮忙

【问题讨论】:

vector 不能带走海盗物品。使用船舶(智能)指针向量来获取新的海盗对象。 您的向量位于内存中,就在一个大数组之后。我的猜测是您正在超出该数组的末尾并破坏了向量。 user1320881:你能告诉我为什么我应该使用指针吗?我想避免它们,因为它弄乱了我所有的程序:/ Alan Stokes:我也应该将数组转换为向量吗? @ Ερωτόκριτος Δάμπασης:“myShips.push_back(pirate(...”) 行正在对您的海盗对象进行切片。多态性仅适用于指针和引用。有关切片的更多信息:***.com/questions/274626/what-is-object-slicing。 @user1320881:终于可以正常使用指针了!非常感谢您的大力帮助!:D 【参考方案1】:

查看这段代码,您是否为map 创建了自定义定义?否则,如果您尝试创建一个 [N][M] 个 Map 对象数组,则缺少 map 的类型声明。例如map&lt;int,string&gt; 如果您尝试将 map 用作多维数组,这不是 std::map 的用途。 Map 是用于存储键/值对的通用容器。

【讨论】:

地图 (&myArray)[N][M] 有一些关于每个地点的天气、港口和宝藏的信息。我也制作了一个类“地图”和一个构造函数。但我没有上传它,因为我不认为这可能是相关的。 @AlanStokes 是的,我想将其添加为评论,但我还没有足够的声誉来评论帖子。我知道这违反了指导方针,但我只是觉得有必要澄清一下。 和@ΕρωτόκριτοςΔάμπασης感谢您的澄清。

以上是关于调整对象矢量大小时出错的主要内容,如果未能解决你的问题,请参考以下文章

调整 PaintCode 应用程序生成的图像大小

内存访问错误 - 矢量调整大小

在 Swift 中调整 UICollectionViewCell 大小时出错

矢量调整大小后下标超出范围

在VBScript中调整对象内部的数组大小

在 IE 中使用 JS 调整图像大小时出错