Mam taką małą zagwozdkę; trochę teoretyczny problem, ale niech tam, opiszę na forum.
Załóżmy, że mamy przykładowe dwie klasy Vertex
i Graph
:
struct Vertex {
private:
int vertexNumber;
int someProperty;
public:
void setSomeProperty(int value);
}
oraz
#include <vector>
#include "Vertex.hpp"
class Graph {
private:
std::vector<Vertex> v;
public:
const vector<Vertex> & getV() const;
}
(Załóżmy jeszcze, że v
jest na tyle duże, że nie opłaca się go pobierać przez wartość [mam nadzieję, że referencja jest tutaj sensowna].)
Jeśli chciałbym zmodyfikować jakiś Vertex
, czyli v[i]
, to wywołałbym metodę setSomeProperty()
. No ale do v[i]
mam dostęp tylko za pomocą getV()
, która zwraca stałą referencję, więc nic z tego.
Z uwagi na powyższe, mam dwie możliwości do wyboru (dwie znam ja, może jest więcej?):
- Pierwsza - zdefiniować metodę
setVertexSomeProperty()
w klasieGraph
:
// definicja
void Graph::setVertexSomeProperty(int vertexNumber, int value) {
this->v.at(vertexNumber).setSomeProperty(value);
}
// wywołanie
Graph g();
g.setVertexSomeProperty(1, 2);
- i druga - zdefiniować metodę
getVertex()
w klasieGraph
i na wyniku tej metody wywołać odpowiednią metodę z klasyVertex
:
// definicja
Vertex& Graph::getVertex(int vertexNumber) {
return this->v.at(vertexNumber);
}
// wywołanie
Graph g();
Vertex v = g.getVertex(1);
v.setSomeProperty(2);
I teraz moje pytanie: czy któraś z tych możliwości jest lepsza, a jeśli tak, to pod jakimi względami?
PS. Rozumiem oczywiście, że jeśli referencja w metodzie (@_13th_Dragon podał trzecie rozwiązanie).getVertex
jest niewłaściwa, to problem sam się rozwiązuje, bo zostaje jedna możliwość (o ile nie ma ich więcej)
PS2. Czy zamiast (już podano odpowiedź)Vertex v = ...
nie powinno być Vertex& v = ...
?