Pregunta

Estoy escribiendo un juego y un adjunto del motor en C ++. El motor se basa principalmente en la automatización mediante un sencillo lenguaje de script embebido. Los scripts pueden crear clases de objetos, definir los detectores de eventos en ellos, y producir casos de ellos. En la actualidad, una instancia debe estar enlazado a un identificador-script mundial a fin de preservar su existencia. El resultado obvio de esto es que no puede haber objetos anónimos, que será, con mucho, el más común.

En la actualidad, los casos se gestionan mediante un std::set<Instance*, spatial_sort>, donde spatial_sort es un funtor que ordena casos por posición, para la representación y la detección de colisiones. Las instancias se retiran y se vuelven a insertar cada fotograma utilizando su posición actual como un indicio, bajo el supuesto de que no es probable que se mueva mucho en una quincuagésima parte de un segundo. Si una bandera dead se encuentra en la instancia, se borra del conjunto. Los constructores Instance y destructor invocan insert(this) y erase(this), respectivamente.

Con el fin de permitir que las instancias anónimas, quiero cambiar el juego a un std::set<boost::shared_ptr<Instance>, spatial_sort>, lo que permitiría Instance para compartir la propiedad de instancias y preservar su existencia hasta que se destruyen a sí mismos. Por desgracia, debido a que las llamadas a insert() necesitan ser colocados en el constructor, shared_from_this() no va a funcionar para obtener un shared_ptr a la Instance. No importa en absoluto que Instance pasa a heredar ya desde boost::enable_shared_from_this<> a través de su clase base.

¿Alguien puede recomendar una solución adecuada?

Editar

Hice lo que debería haber hecho en el primer lugar, y dividir el comportamiento de la clase Instance en dos clases: Instance y Reference. El new SomeClass expresión en una secuencia de comandos devuelve un Reference a un nuevo Instance. El Instance objetos mismos nunca se gestionan mediante un shared_ptr, por lo que son responsables de cometer suicidio en respuesta a un evento apropiado, por ejemplo, al final de la animación, al final del nivel, etc.

Gracias por la ayuda! Refactoring es tan buena como cualquier solución si simplemente funciona.

¿Fue útil?

Solución

Se podría añadir un método estático a Instance que luego utiliza para crear nuevos objetos y que también lo hace la materia administrativa como la adición al conjunto:

static Instance* create(int something) {
  boost::shared_ptr<Instance> sptr(new Instance(something));
  instanceset.insert(sptr);
  return sptr.get();
}

Si desea hacer de esta la única manera de construir un objeto de esta clase también se puede realizar el constructor normal, privada o protegida.

Para más información sobre esto, véase también la entrada C ++ FAQ Lite acerca " Enlace dinámico durante la inicialización ", que no está directamente relacionada pero utiliza la misma técnica para evitar las restricciones en el uso de funciones virtuales en los constructores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top