Sto creando la mia classe Filter personalizzata da utilizzare in boost :: filtered_graph. Il concetto WeightMap deve avere un costruttore predefinito, un costruttore di copie e un operatore di assegnazione.Assegnazione di uno std :: shared_ptr negli operatori di assegnazione
Ho creato la classe seguente, che ha un membro privato std :: shared_ptr. La mia domanda è come dovrei scrivere l'operatore del compito. Il costruttore di copie non era un problema, ma l'operatore di assegnazione non funziona.
class BFDMFilter
{
private:
const BGraph* m_battlemap;
const std::shared_ptr<MoveAbility> m_mv_ab;
public:
BFDMFilter() : m_battlemap(nullptr), m_mv_ab() { }
BFDMFilter(const BGraph* bmap, std::shared_ptr<MoveAbility> mv) : m_battlemap(bmap), m_mv_ab(mv) { }
BFDMFilter(const BFDMFilter& filter) : m_battlemap(filter.m_battlemap), m_mv_ab(filter.m_mv_ab) { }
BFDMFilter& operator=(const BFDMFilter& filter)
{
if(this != &filter)
{
m_battlemap = filter.m_battlemap;
m_mv_ab = filter.m_mv_ab;
}
return *this;
}
bool operator()(const Edge& edge) const
{
Tile::TileEdge path = (*m_battlemap)[edge];
return m_mv_ab->CanMove(path.TerrainType()) > 0.0;
}
bool operator()(const Vertex& vertex) const
{
Tile tile = (*m_battlemap)[vertex];
return m_mv_ab->CanMove(tile.TerrainType()) > 0.0;
}
};
che poi mi dà un errore di compilazione:
error: passing ‘const std::shared_ptr<momme::battle::MoveAbility>’ as ‘this’ argument of ‘std::shared_ptr<_Tp>& std::shared_ptr<_Tp>::operator=(std::shared_ptr<_Tp>&&) [with _Tp = momme::battle::MoveAbility, std::shared_ptr<_Tp> = std::shared_ptr<momme::battle::MoveAbility>]’ discards qualifiers [-fpermissive]
capisco perché; l'operatore di assegnazione modifica il conteggio dei riferimenti di shared_ptr quando esegue l'assegnazione, in modo che possa tenere traccia del numero di riferimenti aperti esistenti. Ma allora, come scrivo l'operatore di assegnazione? std :: weak_ptr ha lo stesso comportamento, e se faccio il riferimento non-const, la libreria boost lamenta che la funzione è stata cancellata.
Non sono sicuro del motivo per cui il puntatore deve essere const ... intendi 'std :: shared_ptr m_mv_ab', invece? Vuoi lo 'std :: shared_ptr' stesso const o l'oggetto a cui punta per essere const? –
Non è possibile eseguire l'assegnazione con * qualsiasi * membro dati const '. Questo non è specifico per 'shared_ptr'. – juanchopanza