Új hozzászólás Aktív témák
-
PandaMonium
őstag
válasz
m.zmrzlina
#4159
üzenetére
Pl.
#include <iostream>
#include <vector>
#include <string>
template<typename T>
std::size_t sizeOfContainer(const T& container) {
return container.size();
}
int main()
{
std::vector<int> x = { 1, 2, 3 };
std::string y = "foobar";
std::cout << sizeOfContainer(x) << std::endl;
std::cout << sizeOfContainer(y) << std::endl;
return 0;
}Ez a kódrészlet nem működne a string-en, ha nem lenne size függvénye, külön template specializációt kéne rá írni. Egyébként ahogy már írták elsősorban azért van size() függvénye, hogy hasonlítson a containerek intefészére, elvégre a string csak egy karakter container (iterátorai is vannak).
-
PandaMonium
őstag
válasz
jattila48
#4083
üzenetére
Ha kinyitod a cppreference.com-ot akkor látod, hogy az std::function
T* target() noexcept;metódusával visszakapod a függvény pointert amit úgy hívsz meg ahogy akarsz. Ha nem észt osztani járnál ide (főleg miután te kérsz segítséget), hanem utána olvasnál a dolgoknak előrébb lennél. -
PandaMonium
őstag
-
PandaMonium
őstag
válasz
choco01
#4048
üzenetére
Az objektum-orientált programozás egyik alapelve az enkapszuláció, ami magyarul annyit tesz, hogy mindig csak annyit akarsz láthatóvá tenni egy-egy objektumodból amennyit nagyon muszáj. Alapból minden adattag és függvény legyen privát, akkor legyen bármi is publikus, ha kívülről el akarod érni az adott dolgot.
Konstruktor jelen esetben a
kolcsonzo(char fnev[]);, ez mondja meg milyen paraméterekkel tudsz létrehozni egy példányt (= objektumot) az osztályodból. Itt egychar[]-t vár paraméterként a konstruktor, ami egy karaktertömb/karakterlánc. Emiatt így tudsz pl. létrehozni egy példányt a kolcsonzo-ből:kolcsonzo peldany("karakterlanc");.A destruktor ez a sor:
~kolcsonzo();.
Ez akkor fog lefutni mikor a példány megszűnik létezni. Ez már kicsit haladóbb téma, de röviden annyit, hogy tudsz objektumokat létrehozni a stack-en és a heap-en is. Minden amitnewnélkül példányosítasz az a stacken jön létre, amitnew-al az pedig a heap-en.A stacken létrejövő dolgok automatikusan megszűnnek létezni mikor a stack megszűnik (végetér a
{ }zárójel), ezzel szemben a heap-en létrehozott dolgok ott maradnak egészen addig amíg meg nem hívod a memóriacímükre adelete-et. Bármelyik eset is álljon fenn, ilyenkor lefut a objektum destruktora.Ezek nagyon gyakori kérdések, ne jegyzetből tanuld meg őket, csak keress rá, hogy objektum-orientált programozás (object-oriented programming vagy OOP) és kismillió tutorialt fogsz találni.

-
PandaMonium
őstag
válasz
dangerzone
#4026
üzenetére
Nyelv független, de teljesen jó, egyre nehezedő feladatokkal. Kicsit matekos lehet a nehezebb feladatoknál, de nem vészes.
-
PandaMonium
őstag
Dobj egy PM-et és megbeszéljük.
(#4016) Bici: Alex Allain: Jumping into C++, majd Scott Meyers: Effective Modern C++. Ha van már programozói tapasztalatod, ezt a kettőt elolvasod 1 hét alatt és tudsz alap/közép szinten C++ozni. Mire a memóriamodellt megérted és megtanulod hatékonyan kezelni a kézzel való allokálást (smart pointereket is ideértve) az sokáig fog tartani.
-
PandaMonium
őstag
válasz
m.zmrzlina
#4005
üzenetére
Akkor biztos, hogy nem C++11 standard-al fordítasz, mert a kód helyes és a cpp.sh is elsőre fordítja GCC-vel.
Edit: Másik lehetőség, hogy C++11-el fordítasz, de a rendszeren nem C++11es header-ek vannak telepítve valamiért. Próbáld frissíteni a GCC-t (az 5.4 nem mai csirke) és telepítsd fel apt-al a build-essential csomagot.
-
PandaMonium
őstag
válasz
m.zmrzlina
#3999
üzenetére
std::stoi-val próbáld meg. Minden nem C-s függvény alapvetően az std névtérben van deklarálva. -
PandaMonium
őstag
válasz
mgoogyi
#3992
üzenetére
Biztos, hogy nem ez a probléma, különben a for-ciklus el sem indulna (i < v.size() feltétel).Félreértettem amit mondtál, jogos a felvetés.
(#3997) gepa7: Örülök, hogy megoldódott, de két apróság. Ha csak a vector mögött levő buffer méretét akarod állítani, anélkül, hogy létrejönnének benne az objektumok vagy változna a v.size(), használd a v.reserve() függvényt. A másik, hogy felejtsd el az egy betűs változókat, mert ettől minden programozó falnak megy, és ha másnap ránézel a saját kódodra már te sem fogod tudni mi micsoda. Nekem is többször át kellett olvasnom a kódodat, hogy megértsem, pedig nem egy bonyolult algoritmus.
Szerk: Az is sokat segít ha konzisztensen formázod a kódodat, behúzások rendben vannak, stb.
-
PandaMonium
őstag
-
PandaMonium
őstag
válasz
m.zmrzlina
#3965
üzenetére
A '\r' egy carriage return karakter, ami nem feltételnül fog szerepelni a fájlban. Miért keresnél egyáltalán ilyet? ('\n' = új sor, '\t' = tab, ezeket gondolom tudod)
-
PandaMonium
őstag
válasz
dobragab
#3955
üzenetére
Az STL is objektum-orientált, hogy fogja megérteni pl. hogy működnek a file handlerek, vagy smart pointerek, ha nem tudja mi az a konstruktor és destruktor? Vagy, hogy mikor és miért akkor szabadul fel pl. a vector által allokált memóriaterület? Ez nem Java, hogy majd a GC kipucolja, érteni kell a memória allokálás és felszabadítás folyamatát, különben sokszor lábon fogod lőni magad.
Persze, tanuljon algoritmusokat meg konténereket, adatszerkezeteket, de a nyelv szemantikája és a benne használt paradigmák ugyanilyen fontosak. Ezeket sem kell rögtön PhD szinten tudni, csak annyira, hogy értsd amit csinálsz.
-
PandaMonium
őstag
válasz
dabadab
#3951
üzenetére
Nyilván nem ennyit tanulna belőle. Rögtön jön a header-ekre bontás, akkor az hozza magával az include guardokat, utána osztályon belül scope és láthatóság, statikus adattagok és függvények, getter/setter-ek, öröklődés, stb. Az OOP nagyon nem annyi, hogy "class".
(#3953) emvy: Igen, de ezzel fog a legtöbbet találkozni akkor is ha tutorialokat nézeget, illetve erre épülnek további alapvető (observer, factory, facade, ...) és összetettebb (MVC, ECS, ...) szoftvertervezési minták. Azt mégsem javasolhattam, hogy kezdjen el monad-okról szóló oktatóanyagot keresni funkcionális programozáshoz C++ban.
-
-
PandaMonium
őstag
válasz
daninet
#3947
üzenetére
Állásinterjúra még ne menj vele, de két hét után nem rossz.

Pár apró meglátás, javaslat:
- Printf-et felejtsd el, használd a streameket
- Rand, srand függvényeket szintén felejtsd el, van C++11 óta <random> és szuper(komplikált) randomszám generátor osztály
- Goto-kat függvényhívásokra nagyon egyszerűen ki tudod cserélni
- Olyat nem csinálunk, hogyif (minden_rendben) {} else { hibakezeles; }, hanem negáljuk a feltételt:if (!minden_rendben) { hibakezeles; }
- Pastebin helyett jobb a Github Gist-je, főleg ha több fájlban van a kódod
- Nagyon hasznos volna újraírnod a mostani kódot objektum-orientált stílusban, osztályokat használva, sokat tanulnál belőleHa lesz újra gépem (valszeg péntek) és szeretnéd megírom neked szépen, modern C++ban, hogy lásd a különbséget és tudj belőle tanulni.
-
PandaMonium
őstag
válasz
daninet
#3931
üzenetére
Cpp.sh-n kipróbáltam, működik és megáll az elsőnél. Persze az Linux-on fordít GCC-vel.
I/O streamek kezelése mindig macerás, főleg az input kezelés. Sokszor a terminál/shell bufferelni az inputot Linux alatt is, Windows-on pedig külön egy macera az egész.A do-while ciklusodat próbáld meg kicserélni erre a 3 sorra:
cout << "\nGuritashoz nyomj Entert...";
cin.clear();
cin.ignore(10000,'\n');És a \n helyett érdemesebb
std::endl-t használni cout-ra íráskor az új sorhoz, ez platform független. Arra viszont figyelj, hogy ilyenkor flusholja a streamet, szóval performance hit lehet ha nem jól használod. -
PandaMonium
őstag
válasz
m.zmrzlina
#3905
üzenetére
Ettől általánosabb ha ahogy javasolták is, funktorokat használsz.
bool novekvo(float elso, float masodik)
{
return elso < masodik;
}
int cseres(float tomb[],int meret, const std::function<bool(float, float)>& feltetel)
{
float temp=0;
for (int i=0;i<meret-1;i++)
{
for (int j=i+1;j<meret;j++)
{
if(feltetel(tomb[j], tomb[i]))
{
temp=tomb[i];
tomb[i]=tomb[j];
tomb[j]=temp;
}
}
}
return 0;
}Itt a cseres függvény harmadik paramétere egy olyan funktor ami bool visszatérési értékű, és két float paramétert fogad. Ilyen pl. a novekvo függvény ami felette van definiálva. Tehát az a függvény hívás, hogy
cseres(tombom, tombom_merete, novekvo);teljesen valid.
Pár megjegyzés még, mert írtad, hogy most tanulod a nyelvet:
- C stílusú (float[], int[], stb.) tömböket ne használj, akkor sem ha ezt látod tutorialokban vagy ezt oktatják egyetemen. Modern C++ban ha folytonosan szeretnénk tárolni valamit a memóriában (ahogy a tömb is semmi más mint egy folytonosan allokált memóriaterület) és fordítás időben (azaz a program írásakor, nem futtatáskor) tudjuk mekkora tömb kell nekünk akkor std::array-t használunk, egyébként, ha dinamikus méretű tömbre van szükségünk akkor std::vector -t.
- Jelenleg a kódod csak egy adott típusú tömbre (float) fog működni. Ha template függvényt csinálsz belőle kirakhatod ezt a típust template paraméterbe és akármilyen típusra fog működni - itt persze feltétel lesz, hogy a funktor is ennek a típusnak két példányát fogja fogadni.
- Nincsen kőbe vésve, de konvenció, hogy ha egy konténer két elemét hasonlítjuk össze akkor az az elem kerül az összehasonlítás bal oldalára ami előrébb van a konténerben. Ennek egy logikai összehasonlításkor nincs sok jelentősége, mert legfeljebb megfordítod az operátort (
(a > b) == (b < a)), de pl. ha funktoroknak adod át a paramétereket akkor fontos, hogy a funktor milyen sorrendben várja az elemeket.
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- CADA, Polymobil, és más építőkockák
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- One otthoni szolgáltatások (TV, internet, telefon)
- Robotporszívók
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- One mobilszolgáltatások
- LEGO klub
- Call of Duty: Black Ops 7
- BestBuy topik
- SSD kibeszélő
- További aktív témák...
- BESZÁMÍTÁS! Apple Watch Ultra 2 49mm Cellular okosóra garanciával hibátlan működéssel
- Thinkpad P52s workstation: Core i7 8650U, 32GB RAM, P500 2 GB VGA, új kijelző és akkumulátorok
- GYÖNYÖRŰ iPhone 12 mini 64GB Purple -1 ÉV GARANCIA - Kártyafüggetlen, MS3851, 100% Akksi
- GeForce RTX 2070 blower (OEM HP) Garanciával
- Lenovo T14S Thinkpad FHD IPS i5-1135G7 16GB RAM 256GB SSD Intel Iris XE Graphics Win11 Pro Garancia
Állásajánlatok
Cég: BroadBit Hungary Kft.
Város: Budakeszi
Cég: ATW Internet Kft.
Város: Budapest


