【问题标题】:vector of class definition类定义向量
【发布时间】:2012-10-11 21:50:06
【问题描述】:

以下是我为将边界框划分为更小的部分所做的一个类。

class reticula
{   
    int _columnas;
    int _renglones;
    int _num_pixelotes;
    vector<vector<Point> > Pixelotes;

public:
reticula():
_columnas(0),
_renglones(0),
_num_pixelotes(0),
Pixelotes(){};
/// crear la reticula con los valores deseados 
reticula(vector<Point> verticesB, int renglon, int columna);

Size size(void);
vector<Point> en(int el_renglon, int la_columna);
~reticula(void);
};  

reticula::reticula(vector<Point> verticesB, int renglon, int columna ){
if(verticesB.size()!= 4){
    cout<< "El vector debe tener las 4 esquinas del rectangulo a dividir"
        << endl;    
    throw 400; // es para mandar la exepción. 
}
_columnas = columna;
_renglones = renglon;
_num_pixelotes = columna * renglon ;
Pixelotes.resize(_renglones * _columnas); 
double dis_mayor, dis_menor;//con respecto a los ejes 
Point dif_10;
Point dif_21;
Point dif_32;
Point dif_03;
double es_mayor, es_menor;


dif_10 = verticesB[1]-verticesB[0];
dif_21 = verticesB[2]-verticesB[1];
dif_32 = verticesB[3]-verticesB[2];
dif_03 = verticesB[0]-verticesB[3];

dis_mayor = norm(dif_10);
dis_menor = norm(dif_21);

es_mayor = dis_mayor/(double) _columnas;
es_menor = dis_menor/(double) _renglones;
Point aux;
Point aux2;
vector<Point> vertices_re((_columnas + 1)*(_renglones + 1));
for (int i = 0; i < _renglones; i++){
    for(int j= 0; j < _columnas; j++){
        for(int h=0; h < 4; h++ ){
            aux = verticesB[0] + ((((double)j*dis_mayor) * dif_10) + (((double)i * dis_menor)*dif_21));
            if(h=0){aux2= aux;}
            else if(h=1){aux2= aux + (dis_mayor * dif_10);}
            else if(h=2){aux2= aux + (dis_mayor * dif_10) + (dis_menor * dif_21);}
            else if(h=3){aux2= aux + (dis_menor * dif_21);}
            Pixelotes[i * _columnas + j].push_back(aux2);
        }
    }
}


}


Size reticula::size(void){
Size Total;
Total.width = _columnas;
Total.height = _renglones;
return Total;

}

vector<Point> reticula::en(int el_renglon, int la_columna){
if(el_renglon > _renglones|| la_columna> _columnas){
    cout << " el renglon y la columna se deben encontrar dentro de los parametros "
        <<endl;
    cout<< _renglones<<" , "<<_columnas<<endl;
    vector<Point> vacio;
    vacio.push_back(Point(0,0));
    return (vacio);
}
int busca;
busca = el_renglon * _columnas + la_columna;    
}

我想创建一个包含这个类的向量,但我不知道我做错了什么

vector<reticula> SoloReti(contours.size());
for(int g=0; g< SoloReti.size(); g++){
    SoloReti[g].reticula(contours[g], 5,4);
}

g++ 编译器告诉“reticula::reticula 的使用无效”有人能告诉我问题出在哪里吗?

【问题讨论】:

  • 附带说明,如果您的向量矩阵经常迭代,那么您最好在一个大块中分配一个向量。使用您当前的方法,顶级向量的每个元素(本身就是一个向量)将为存储执行第二次堆分配,这几乎会扼杀数据的局部性。
  • 感谢您的回答,现在我明白代码有什么问题了。也许将所有点放在一个向量中会更好,但我认为以这种方式保存点以供将来参考会很有用。

标签: c++ opencv vector


【解决方案1】:

当您声明vector&lt;reticula&gt; SoloReti(contours.size()) 时,它会使用contours.size() reticula 初始化向量,并使用默认构造函数reticula()

当您执行SoloReti[g].reticula 时,您正在尝试从已构造的对象中调用构造函数。解决方法:使用赋值运算符:

vector<reticula> SoloReti(contours.size());
for(int g=0; g< SoloReti.size(); g++){
    SoloReti[g] = reticula(contours[g], 5,4);
}

【讨论】:

  • 技术上SoloReti[g] 尚未构建,因为它不存在。以大小为参数的构造函数只是分配空间,不初始化。
  • 我不同意 Geoff,向量构造函数确实初始化了对象,而 Soloreti[g] 给出了一个完全有效的实例。此外,SoloReti 是用 contours.size() 构造的,所以如果 contours.size() == 0,则循环什么也不做。
  • 这只是表明您应该始终根据文档仔细检查您的直觉。正如他们所说的那样。我不确定为什么我认为这个构造函数的行为不同。我经常使用 C++,但我一直在切换语言,所以也许我把它与其他东西混淆了。我的错。
【解决方案2】:

我想这就是你想要的:

vector<reticula> SoloReti;

for(int g = 0; g < countors.size(); g++)
{
    reticula tmp(contours[g], 5, 4); 
    SoloReti.push_back(tmp);
}

【讨论】:

  • 不。 Soloreti 使用 contours.size() 元素进行初始化。如果你执行 push_back,SoloReti 的大小将在循环结束时为 contours.size()*2。自己试试吧!如果您将 Soloreti 声明为 vector SoloReti,但未指定大小,则答案将是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多