Ho una classe che rappresenta un file in formato binario specifico su disco (il genitore nel titolo) e un'altra classe che rappresenta un oggetto all'interno di quel file (figlio). Quando l'oggetto cambia, a volte ha bisogno di riposizionarsi in una nuova posizione nel file e la classe del file deve essere notificata su questa nuova posizione.
Per fare ciò, ho aggiunto un campo weak_ptr
all'oggetto, che punta al file. Tranne che ciò significa che ci deve essere un shared_ptr
per il file, quindi sto usando un metodo factory static
invece di un costruttore pubblico per questo. E l'oggetto ora non può essere inizializzato nel costruttore, quindi sto usando unique_ptr
per questo.
Nel codice, assomiglia a questo:
class File;
class Object
{
private:
std::weak_ptr<File> file;
public:
Object(std::weak_ptr<File> file)
: file(file)
{}
void modify();
};
class File
{
private:
std::unique_ptr<Object> object;
std::shared_ptr<File> self;
File()
{}
public:
void setObjectPosition(std::uint64_t newPosition);
static std::shared_ptr<File> create();
};
void Object::modify()
{
std::uint64_t newPosition = …;
file.lock()->setObjectPosition(newPosition);
}
void File::setObjectPosition(std::uint64_t objectPosition)
{
// store objectPosition
}
std::shared_ptr<File> File::create()
{
auto file = std::shared_ptr<File>(new File());
file->self = file;
file->object = std::unique_ptr<Object>(new Object(file));
return file;
}
È questo l'approccio giusto per fare questo? O c'è una soluzione migliore / più idiomatica? Mi sembra di usare troppo *_ptr
, ma non riesco a pensare a qualcosa di meglio.