Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: anonimo12121 en 17 Junio 2013, 11:48 am



Título: Añadir objetos vacios a vector para luego modificarlo.
Publicado por: anonimo12121 en 17 Junio 2013, 11:48 am
Hola estoy haciendo unas clases que contienen miembro de vector, de la siguiente forma.
Código
  1. vector<clase1> listaclase1;
  2. listaclase1.push_back(clase1());
  3. listaclase1[0].add(x);
Hasta aquí va todo bien el problema es cuando la clase1 herede de una clase que tiene sobrecargado el operador "=" para que no sea copiable.

Código
  1. class SFML_SYSTEM_API NonCopyable
  2. {
  3. protected :
  4.    NonCopyable() {}
  5. private :
  6.    NonCopyable(const NonCopyable&);
  7.    NonCopyable& operator =(const NonCopyable&);
  8. };

entonces no puedo hacer lo que intentaba hacer arriba, haber si alguien me puede ayudar y encontrar una solucion sea con puntero o como sea.

He pensado que quizás estoy haciendo un mal hábito en el vector


TROZO DE MI CÓDIGO
Código
  1. sf::Texture t1;
  2.    t1.loadFromFile("image/p1.png");
  3.  
  4.    Widgets.push_back(Widget());
  5.    Widgets.push_back(Widget());
  6.    Widgets[0].setTexture(t1);
  7.    Widgets[1].setTexture(t1);
  8.    Widgets[1].setPosition(100,20);
  9.    Layouts.push_back(Layout());// Aquí ya falla
  10.    Layouts[0]->addWidget(&Widget1);


Título: Re: Añadir objetos vacios a vector para luego modificarlo.
Publicado por: amchacon en 17 Junio 2013, 11:59 am
No es el operador de asignación, sino el constructor copia.

Sin probarlo se me ocurre lo siguiente:

Código
  1. sf::Texture t1;
  2. Layouts Nuevo;
  3. t1.loadFromFile("image/p1.png");
  4.  
  5. Widgets.push_back(Widget());
  6. Widgets.push_back(Widget());
  7. Widgets[0].setTexture(t1);
  8. Widgets[1].setTexture(t1);
  9. Widgets[1].setPosition(100,20);
  10. Layouts.push_back(Nuevo);
  11. Layouts[0]->addWidget(&Widget1);


Título: Re: Añadir objetos vacios a vector para luego modificarlo.
Publicado por: anonimo12121 en 17 Junio 2013, 12:58 pm
No es el operador de asignación, sino el constructor copia.

Sin probarlo se me ocurre lo siguiente:

Código
  1. sf::Texture t1;
  2. Layouts Nuevo;
  3. t1.loadFromFile("image/p1.png");
  4.  
  5. Widgets.push_back(Widget());
  6. Widgets.push_back(Widget());
  7. Widgets[0].setTexture(t1);
  8. Widgets[1].setTexture(t1);
  9. Widgets[1].setPosition(100,20);
  10. Layouts.push_back(Nuevo);
  11. Layouts[0]->addWidget(&Widget1);

Lo he conseguido haciendo que el vector sea de punteros.
Código
  1.    typedef vector<Layout*> ListLayouts;
  2. ....
  3.  
  4. sf::Texture t1;
  5.    t1.loadFromFile("image/p1.png");
  6.    Layout Nuevo;
  7.    Widgets.push_back(Widget());
  8.    Widgets.push_back(Widget());
  9.    Widgets[0].setTexture(t1);
  10.    Widgets[1].setTexture(t1);
  11.    Widgets[1].setPosition(100,20);
  12.    Layouts.push_back(&Nuevo);
  13.    Layouts[0]->addWidget(&Widget1);
  14.    Layouts[0]->addWidget(&Widgets[1]);
  15.  
Lo que intentaba era hacerlo de forma que no tuviera:
Código
  1. Layout Nuevo;

en plan Layouts.push_back(Layout());

Layout es una clase mi que hereda de otra clase de la libreria sfml

NoCopyable -> RenderTexture -> Layout.