Domanda

Perché il seguente non lavoro:

#include <iostream>
#include <fstream>
#include <stack>

std::stack<std::ifstream> s;

-PT

È stato utile?

Soluzione

std::stack (come tutti i contenitori STL) richiede che il tipo contenute essere "assegnabile". In STL-parlare, il che significa che si deve avere un costruttore di copia e un operator=. std::ifstream ha nessuna di queste.

Si può immaginare il motivo per cui non si vuole essere in grado di copiare e assegnare I / O stream; la semantica di quello che dovrebbe accadere quando ci sono due copie dello stesso torrente non sono evidenti. Nel caso di una lettura o la scrittura di una copia influenzare la posizione dell'altro copia? Dovrebbe chiudere un flusso vicino all'altro? ecc.

Se si vuole avere "un contenitore di std::ifstreams", allora che cosa si dovrebbe fare è "un contenitore di std::ifstream*s". puntatori non edificati sono sempre assegnabili. L'avvertenza è che in questo caso, naturalmente, si deve fare in modo di eliminare i puntatori se stessi prima distruggendo il contenitore, dal momento che il contenitore non lo farà per voi.

Altri suggerimenti

Perché i flussi non sono copiabili è possibile tecxhnicaly metterli in contenitori standard.

Ma possiamo andare in giro che storeing puntatori al flusso. Ma non volete memorizzare i puntatori ai corsi d'acqua (soprattutto se essi sono allocati dinamicamente) in un contenitore standard. Quindi cerchiamo di spinta per una soluzione.

Boost ha il concetto di contenitori puntatore.
Questo consente di allocare dinamicamente un oggetto e memorizzare il puntatore nel contenitore puntatore che poi assume la proprietà dell'oggetto e ti dà accesso all'oggetto dinamico come se fosse l'oggetto (piuttosto che un puntatore).

A causa del contenitore puntatore assume la proprietà usi t necessità di preoccuparsi per l'eliminazione dell'oggetto. Il contenitore che farà.

Perché dà accesso agli oggetti contenuti come oggetti piuttosto che puntatori che consente di utilizzare il flusso di algoritmi standard in una fashon più naturale (campared con un contenitore di puntatori).

Backup Tyler qui (dopo aver votato +1).

I contenitori STL fanno copie in tutto il posto degli oggetti si dà loro. Se si desidera, è possibile far fronte a questo, dando loro oggetti speciali con costruttori di copia cura artigianale e destructurs con il conteggio dei riferimenti e quant'altro.

In generale, trovo che modo troppi problemi. Proprio come regola generale, utilizzare solo piccoli oggetti nei contenitori. Se si vuole fare una pila di strutture o classi, uso puntatori per loro, invece.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top