mam kodu C++, który sprowadza się do czegoś, co następuje:inicjować zmienne składowe const
class Foo{
bool bar;
bool baz;
Foo(const void*);
};
Foo::Foo(const void* ptr){
const struct my_struct* s = complex_method(ptr);
bar = calculate_bar(s);
baz = calculate_baz(s);
}
Semantycznie, bar i BAZ zmienne składowe powinny być const, gdyż nie powinno się zmienić po inicjalizacji. Wydaje się jednak, że aby tak się stało, musiałbym zainicjować je na liście inicjującej, a nie przypisywać. Aby było jasne, rozumiem, dlaczego muszę to zrobić. Problem polega na tym, że nie może się znaleźć jakiś sposób na konwersję kodu do listy inicjalizacji nie robiąc jedną z następujących niepożądanych rzeczy:
- połączenia
complex_method
dwukrotnie (byłoby złe dla wydajności) - Add wskaźnik do klasy Foo (spowodowałby niepotrzebnie duży rozmiar klasy)
Czy istnieje jakiś sposób, aby ustawić zmienne, unikając tych niepożądanych sytuacji?
Na marginesie, jesteś pewien, że 'complex_method' powinien wrócić przez wskaźnik? A jeśli tak, to nie musisz go czyścić, co sugeruje użycie 'std :: unique_ptr', aby go zapisać? – Deduplicator
W porządku, właśnie uprościłem rzeczywisty kod powyższego fragmentu, aby uzyskać zwięzłość. – dooglius
Unikaj tworzenia stałych członków. Jeśli obiekt Foo nie powinien się zmienić, zamiast tego należy ustawić rzeczywisty obiekt const. –