Nedávno jsem narazil na zajímavou situaci, kdy mi překladač u C++ kódu hlásil varování, že vytvořený objekt není nikde použitý, ale přitom se na něm hned na dalším řádku volala metoda. Pojďme se společně podívat na onen kód a na to, zda měl překladač pravdu.
Kód a varování
Měl jsem takovýto kód:
MyClass& x = other.getObject(); x.doSomething();
Když jsem jej přeložil přes MSVC 2015, tak mi překladač hlásil následující varování:
warning C4189: 'x': local variable is initialized but not referenced
Cože? Vždyť na tom objektu hned na dalším řádku volám metodu!
I přes moje počáteční zmatení se však ukázalo, že měl překladač pravdu. Zkuste se nad tím na chvíli zamyslet, zda dokážete přijít s řešením. Preprocessor (makra apod.) v tom roli nehraje.
Řešení
C++ umožňuje volat statickou metodu třídy i přes instanci této třídy [C++14 9.4/2]. Tedy pokud MyClass
vypadá takto
class MyClass { public: // ... static void doSomething(); };
tak když potom napíšete
x.doSomething();
tak je to to stejné, jako byste napsali
MyClass::doSomething();
Čili kód výše vlastně dělá toto:
MyClass& x = other.getObject(); MyClass::doSomething();
Z takto upravené varianty je již jasně vidět, že měl překladač pravdu.