DOMANDA C++| Dubbio su shared_ptr

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
Contesto: Ho questa classe Matrix qui:

CSS:
#include <initializer_list>
#include <vector>
#include <memory>
#include <iostream>
using Array2D = std::vector<std::vector<double>>;

class Matrix
{
public:

    Matrix(unsigned rows, unsigned columns, std::initializer_list<double> elements);
    ~Matrix();

    inline unsigned rows()const { return _rows; }
    inline unsigned columns()const { return _columns; }
    inline std::shared_ptr<Array2D> matrix()const { return _matrix; }

    //Overloaded Operators
    friend inline std::ostream& operator<<(std::ostream& stream, const Matrix& M);
private:
    unsigned _rows;
    unsigned _columns;
    std::shared_ptr<Array2D> _matrix = nullptr;
};

notare la riga
CSS:
 inline std::shared_ptr<Array2D> matrix()const { return _matrix; }
che ritorna un shared_ptr ad un vector<vector<double>> nell'heap.
Il problema con questo sistema è che nelle funzioni mi ritrovo a fare chiamate brutte da vedere, tipo

CSS:
(*mM.matrix())[I][J++] = (*M.matrix())[i][j];

Se però modifico quel getter in
CSS:
 inline Array2D& matrix()const { return *_matrix; }

allora posso scrivere
CSS:
mM.matrix()[I][J++] = M.matrix()[i][j];
Che è più in linea con quello che vorrei ottenere.

Solo che non sono ancora tanto pratico con shared_ptr, quindi volevo sentire i vostri pareri per capire se è una buona idea o qualcosa che dovrei evitare, visto che mi pare che così sto bypassando la protezione offerta dallo shared_ptr.. :look::look:

Altra cosa, se invece scrivo Array2D senza il &
CSS:
inline Array2D matrix()const { return *_matrix; }
il vector viene ritornato by value e quindi non è più un problema, giusto?
 
Ultima modifica:

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Perché non lo rendi pubblico, se effettivamente è come se lo fosse? Inoltre, hai pensato ad un proxy object con overloaded operator[] ma la matrice privata?
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
Perché non lo rendi pubblico, se effettivamente è come se lo fosse? Inoltre, hai pensato ad un proxy object con overloaded operator[] ma la matrice privata?
Bhe anche se fosse pubblico hai comunque uno shared_ptr, quindi stai comunque facendo dereference e poi access quindi lì non cambia molto, riguardo operator[] ci avevo pensato vagamente, ovvero mi ricordavo della possibilità ma non come dichiararlo, e per qualche ragione poi non avevo controllato, brainfart xD
Proverò, thanks :)
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Il fatto è che non ci puoi andare molto intorno ("bypassare" la cosa) giacché tu hai un puntatore, permettimi di dire di dubbia utilità, ad una matrice e i puntatori non sono array. Come dicevo, puoi affidarti ad un proxy object che maschererebbe un attimino la cosa.
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Dimenticavo, dai uno sguardo anche a librerie già esistenti per avere spunti sul design ;)
 
  • Mi piace
Reazioni: Marcus Aseth

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!