2012-10-11 5 views
1

Ce qui suit est une classe que j'ai faite pour diviser une boîte englobante en plus petits morceaux.vecteur de définition de classe

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;  
} 

Je veux créer un vecteur qui contient cette classe, mais je ne sais pas ce que je fais mal

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

Le compilateur g ++ indique « utilisation invalide de :: réticule réticule » quelqu'un peut-il me dire où est le problème?

+0

Sur une note de côté, si votre matrice de vecteur est itéré souvent alors vous êtes beaucoup mieux allouer un vecteur dans un seul gros morceau. Avec votre approche actuelle, chaque élément du vecteur de niveau supérieur (un vecteur en soi) effectuera une seconde allocation de tas pour le stockage, ce qui tue à peu près la localité des données. –

+0

Merci pour la réponse, maintenant je comprends ce qui ne va pas dans le code. Et peut-être qu'il vaudra mieux mettre tout le point dans un seul vecteur, mais je pense qu'il sera utile de garder les points de cette manière pour référence future. – user1649814

Répondre

1

Lorsque vous déclarez votre vector<reticula> SoloReti(contours.size()), il initialise le vecteur avec contours.size() construction de réticules avec le constructeur par défaut reticula().

Lorsque vous faites SoloReti[g].reticula, vous essayez d'appeler le constructeur à partir d'un objet déjà construit. Solution: opérateur d'affectation d'utilisation:

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

Techniquement 'SoloReti [g]' n'a pas encore été construit, car il n'existe pas. Le constructeur qui prend la taille en paramètre alloue juste l'espace, mais ne l'initialise pas. –

+0

Je ne suis pas d'accord Geoff, le constructeur de vecteur initialise les objets, et Soloreti [g] donne une instance parfaitement valide. De plus SoloReti est construit avec contours.size(), donc si contours.size() == 0, la boucle ne fait rien. – remi

+0

http://ideone.com/irQxZ – remi

0

Je pense que c'est ce que vous voulez:

vector<reticula> SoloReti; 

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

Non. Soloreti est initialisé avec des éléments contours.size(). Si vous faites push_back, SoloReti aura la taille contours.size() * 2 à la fin de la boucle. Essayez-le vous-même! La réponse serait valide si vous aviez déclaré Soloreti comme vecteur SoloReti, sans aucune taille spécifiée. – remi

+0

ideone.com/irQxZ – remi