cpp_tips
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| cpp_tips [2016/05/17 15:09] – [Private Hader file] djbuldog | cpp_tips [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 30: | Řádek 30: | ||
| buf-> | buf-> | ||
| </ | </ | ||
| + | |||
| + | ===== stringstream na cout/string ===== | ||
| + | |||
| + | * na příkladu | ||
| + | |||
| + | <file cpp stringstream_test.cpp> | ||
| + | #include < | ||
| + | |||
| + | using namespace std; | ||
| + | |||
| + | int main() { | ||
| + | |||
| + | stringstream ss(" | ||
| + | ostringstream os(" | ||
| + | istringstream is(" | ||
| + | |||
| + | ss.get(); | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | |||
| + | is.get(); | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | |||
| + | // | ||
| + | cout << " | ||
| + | cout << " | ||
| + | //cout << " | ||
| + | cout << " | ||
| + | |||
| + | cout << " | ||
| + | |||
| + | stringstream ss2; | ||
| + | ostringstream os2(" | ||
| + | istringstream is2(" | ||
| + | |||
| + | char my1[]=" | ||
| + | char my2[]=" | ||
| + | char my3[]=" | ||
| + | |||
| + | ss2.rdbuf()-> | ||
| + | os2.rdbuf()-> | ||
| + | is2.rdbuf()-> | ||
| + | |||
| + | ss2.get(); | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | |||
| + | is2.get(); | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | cout << " | ||
| + | |||
| + | // | ||
| + | cout << " | ||
| + | cout << " | ||
| + | //cout << " | ||
| + | cout << " | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | * spuštění vypíše | ||
| + | |||
| + | < | ||
| + | 1: | ||
| + | 2:SS | ||
| + | 3:S | ||
| + | 4:SS | ||
| + | 1: | ||
| + | 2:IS | ||
| + | 3:S | ||
| + | 4:IS | ||
| + | 1: | ||
| + | 2:OS | ||
| + | 4:OS | ||
| + | --- | ||
| + | 1: | ||
| + | 2:SS2 | ||
| + | 3:S2 | ||
| + | 4:SS2 | ||
| + | 1: | ||
| + | 2: | ||
| + | 3:S2 | ||
| + | 4: | ||
| + | 1: | ||
| + | 2:OS2 | ||
| + | 4:OS2 | ||
| + | </ | ||
| + | |||
| + | * všimni si, že přečtení znaku z '' | ||
| + | * řeší se to přenastavením ukazatele a preventivním vymazáním flagů (například EOF flag) | ||
| + | |||
| + | <code cpp> | ||
| + | is.clear(); | ||
| + | is.seekg(0); | ||
| + | </ | ||
| + | |||
| + | * dále, po nastavení bufferu přes '' | ||
| + | * na příčinu jsem zatím nepřišel, ale řešení je použít '' | ||
| + | |||
| ===== Default parametry metody/ | ===== Default parametry metody/ | ||
| Řádek 187: | Řádek 295: | ||
| Conf(); | Conf(); | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | * do zdrojového kódu, kde třídu implementujeme, | ||
| + | |||
| + | ===== Memory leak bez virtuálního destruktoru ===== | ||
| + | |||
| + | * pokud se z třídy dědí, měla by mít virtuální destruktor | ||
| + | * memory leak příklad: | ||
| + | <code cpp> | ||
| + | class Interface | ||
| + | { | ||
| + | | ||
| + | }; | ||
| + | |||
| + | class Derived : public Interface | ||
| + | { | ||
| + | | ||
| + | | ||
| + | { | ||
| + | // Do some important cleanup... | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | void myFunc(void) | ||
| + | { | ||
| + | | ||
| + | // The behaviour of the next line is undefined. It probably | ||
| + | // calls Interface:: | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * je to zajímavé, protože ve třídě nemusí být vůbec dynamická alokace. Stačí, aby měla jako member nějaký objekt, třeba string, a bez zavolaní správného destruktoru nedojde k dealokaci | ||
| + | * řešení je přidat virtuální destruktor do Base třídy, stačí takto: | ||
| + | <code cpp> | ||
| + | virtual ~Interface() {} | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Soubor do paměti ===== | ||
| + | |||
| + | <code c++> | ||
| + | ifstream sfile(filepath.c_str()); | ||
| + | if (!sfile) { | ||
| + | LogMsg(MSGERR, | ||
| + | flen = 0; | ||
| + | } else { | ||
| + | |||
| + | // checking file size... is getFileSize() better? | ||
| + | sfile.seekg(0, | ||
| + | flen = sfile.tellg(); | ||
| + | sfile.seekg(0, | ||
| + | |||
| + | vector< | ||
| + | sfile.read(& | ||
| + | |||
| + | sfile.close(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Paměť do souboru ===== | ||
| + | |||
| + | <code c++> | ||
| + | ofstream f; | ||
| + | |||
| + | f.open(filepath.c_str()); | ||
| + | if (!f.is_open()) { | ||
| + | LogMsg(MSGERR, | ||
| + | return 7; | ||
| + | } | ||
| + | |||
| + | f.write(v.data(), | ||
| + | f << flush; // force to create empty file | ||
| + | f.close(); | ||
| </ | </ | ||
cpp_tips.1463490587.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
