2010-08-02 9 views
5

Estoy a punto de hacer Koenig & Moo's Accelerated C++ y en los capítulos 13 & 14 ellos presentan la idea y la implementación de algunas clases de Handle (simples, compartidas, de referencia contadas).¿Es el mango lo mismo que un puntero inteligente?

Las clases encpasulate un puntero prima y el resumen de la asignación/desasignación de objetos dinámicos de distancia del código de cliente para evitar todos los peligros de punteros primas, así que permite al usuario eliminar la referencia de que tengan acceso a la punta de oponerse. Básicamente es una forma "más segura" de interactuar con recursos de memoria en bruto.

¿Las clases presentadas en estos capítulos son esencialmente implementaciones de punteros inteligentes? Los punteros inteligentes todavía son bastante nuevos para mí, pero por lo que entiendo, estas clases de Manipulación realizan la misma función.

  1. ¿Hay una distinción entre los dos o es solo otro nombre para la misma cosa?
  2. Suponiendo que son equivalentes en la función, en la práctica, ¿alguna vez se escribiría una clase como esta desde cero en lugar de usar una solución de puntero inteligente ya hecha?

EDITAR

Debo añadir que las clases que se desarrollan en estos capítulos son clases de plantilla por lo que no está obligado a un recurso específico, como en que no están diseñando una clase específica FileHandle por ejemplo.

El código en el primer fragmento de código here, 7.1, es más o menos lo que tienen en los capítulos a los que me refiero.

Respuesta

6

De su descripción, suena como un puntero inteligente.
Aunque personalmente no usaría el término manejar, ya que es ligeramente ambiguo (simplemente llame a un puntero inteligente un puntero inteligente).

P: ¿Podría escribir un puntero inteligente desde cero?
A: Si

P: Debe escribir su propio puntero inteligente.
A: No. Es mucho más complicado de lo que piensas. Incluso la descripción en el libro solo pasó por alto los problemas más complejos. Quédese con los estándares proporcionados por bibliotecas acreditadas.

P: Maneja lo que significa.
A: Solía ​​significar un puntero a un puntero. Pero el término ha llegado a ser ambiguo a lo largo de los años ya que el término ha sido reutilizado. Pero puede considerarlo como un puntero a un recurso donde se puede acceder al recurso por otros métodos y en este contexto su descripción es más o menos válida.

P: ¿Debería utilizar punteros inteligentes en lugar de memoria sin procesar?
A: Nunca utilice memoria RAW a menos que sea absolutamente necesario (que prácticamente nunca) siempre lo encapsula en una clase que lo administre. Si la clase es un puntero inteligente u otro tipo de objeto es una buena pregunta. std :: vector no se considera un puntero inteligente, pero encapsula un puntero sin formato.

P: ¿Debe abstraer la gestión de memoria de la lógica de negocios?
A: Es complicado y algunos podrían estar en desacuerdo. Pero yo diría siempre. Una clase debería hacer una cosa. El asunto es la administración de recursos O la lógica de negocios. la combinación de los dos conduce complejidades demasiado imprevistas.

+0

Gracias! Aprecio particularmente las últimas dos preguntas y respuestas. Estoy en esa etapa en la que siento que ya no soy un novato, pero me falta ese tipo de nivel superior, elección de diseño/filosofía que viene con la experiencia. Saludos. – MTLPhil

1

Diría que un identificador es un concepto más general que un puntero inteligente.

Considere, por ejemplo, los identificadores de archivos. Un manejador de archivo puede ser, en efecto, un puntero inteligente a una estructura de datos que representa un archivo abierto, pero el cliente no lo trata realmente como un puntero, sino que simplemente pasa el controlador a una API.

Así que, sí, he escrito en varias ocasiones mis propias clases de control.

+0

Creo que el punto que intentas transmitir es que un identificador es un puntero * opaco * (y puede o no ser inteligente, normalmente no es de hecho). –

+0

@Ben, sí, esa es una buena manera de decirlo. Siéntete libre de editar, si crees que lo necesita. – djna

2

Si perdonas un poco de C++ metafórico, la relación es algo así como: class smart_pointer : public handle;. Un puntero inteligente es un asa que proporciona un estilo de interfaz específico (similar a un puntero) entre el asa y lo que sea que maneje. Un identificador que no sea un puntero inteligente generalmente tendrá (al menos vagamente) operaciones similares, pero su interfaz puede ser completamente diferente.

En algún momento, obviamente, alguien tiene que escribir la (s) clase (s) de puntero inteligente. Al mismo tiempo, esto no es algo para emprender a la ligera. A menos que tenga una especificación muy precisa , probablemente obtendrá al menos algunos detalles incorrectos, y esa "especificación extremadamente precisa" solo reduce las probabilidades a aproximadamente 50:50 ...

OTOH, todavía está no es tan malo como diseñar un puntero inteligente. Esto tiende a ser complicado en extremo. Para un ejemplo obvio, auto_ptr se diseñó y rediseñó varias veces durante la estandarización, pero aún se ve relativamente poco uso en la vida real, y ya se está desaprobando en C++ 0x (reemplazado por std::unique_ptr, que es el producto de un lote de trabajo, debate y no poca cantidad de experimentación y pruebas).

+0

Siempre estoy deprimido por C++ metafórico :) – MTLPhil

Cuestiones relacionadas