Nevšiml jsem si, zda v tomto vláknu bylo zmíněno RAII. To je asi největší výhoda C++ proti jazykům s GC paměti. Zdůrazňuji tu paměť, protože GC neřeší prostředky operačního systému (handly, soubory, sokety) a databázové prostředky (spojení, příkazy, result sety).
Je smůla, že C++ nemá standardní API pro sokety a databáze. Boost nepočítám, protože to není standard.
Jak by mohlo vypadat SQL API pro C++ v duchu RAII, ilustruje třeba knihovna SOCI. Je možné napsat něco jako
std::string jmeno, prijmeni, rodne_cislo = "123456";
SOCI::SQL(db,jméno,heslo) << "select jmeno,prijmeni from tabulka where rodnecislo=:rc", into(jmeno), into(prijmeni), use(rodne_cislo);
První objekt je databázové spojení, které lze uložit do proměnné nebo neuložit a rovnou na něm provést příkaz sql pomocí přetíženého operátoru <<. Pomocí přetíženého operátoru "," jsou zadány vazby na C++ proměnné. Funkce "into" a "use" balí proměnné různých typů do objektů řešících konverzi dat. Prostředky samozřejmě uvolňují destruktory.
Podobně elegantně jsou řešené připravené dotazy i resultset s více řádky, které je navíc možno iteratovat v knihovně STL.
V Javě s JDBC by stejný dotaz vypadal asi takto, s použitím try ... finally pro bezpečné zavření spojení:
Connection c = DriverManager.getConnection(db,jmeno,heslo);
try {
PreparedStatement ps = c.prepareStatement("select jmeno,prijmeni from tabulka where rodnecislo=?");
ps.setString(1, rodne_cislo);
ResultSet rs = c.createStatement().executeQuery("select jmeno,prijmeni from tabulka where rodnecislo=?");
if (rs.next())
{
jmeno = rs.getString(1);
prijmeni = rs.getString(2);
}
} finally {
c.close();
}
Petr123: kdo umí Assembler a C++, je pan Programátor, ale dělá většinou mizerně placený embed jako alarmy, docházkové terminály nebo jiná mačkátka s displeyem, v lepším případě nějaké řízení strojů, i když na to jsou jiné jazyky než C++. A v některých starších firmách se (rovněž za bídné peníze) dělá Win32 desktop ve Visual C++ (MFC) nebo Delphi.