Mam taki mały problem (ale najpierw kod żeby lepiej zrozumieć).
#include <vector>
class Foo {
public:
Foo(int i) : i(i) {}
private:
int i;
};
class Bar {
public:
static const std::vector<Foo> foos;
};
const std::vector<Foo> Bar::foos{ Foo(0), Foo(1), Foo(2) };
class Qux {
public:
Qux() : foo(Bar::foos[0]) {}
void setFoo(int i) { foo = Bar::foos.at(i); }
private:
Foo& foo;
};
int main() {
return 0;
}
Istotna jest tu klasa Bar
, która musi zawierać statyczny wektor obiektów Foo
. Chodzi teraz o to, by kwalifikator const
odnosił się jedynie do samego wektora, a nie elementów tzn. chodzi mi o to, żeby po statycznym zainicjalizowaniu tego wektora nie można było nic dodać ani nic usunąć. Ma on być niezmienny ze względu na ilość elementów, ale co się zrobi z nimi, to już inna bajka. Same obiekty Foo
będzie można jak najbardziej modyfikować, a zatem chciałbym by możliwe było przypisanie jego elementów do nie-const-referencji.
Rozwiązania widzę trzy:
- usunąć
const
z wektoraBar::foos
(ale to osłabia bezpieczeństwo bo będzie można usunąć wszystkie elementy); - kombinować z
const_cast
(nieporęczne bo trzeba będzie stosować to w wielu miejscach kodu); - stworzyć dodatkową klasę
MyThreeElemVector
, która będzie zubożałym interfejsem do wektora, jedynie z metodąget(int i)
(ale też nie bardzo - uważam to za przerost formy nad treścią).
Tylko, że trzy ww. rozwiązania wydają mi się takie trochę łopatologiczne.
Da się to jakoś ładnie zrobić? A jeśli tak to jak?