- One mobilszolgáltatások
- VoLTE/VoWiFi
- Apple Watch
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Honor Magic5 Pro - kamerák bűvöletében
- Mi nincs, grafén akku van: itt a Xiaomi 11T és 11T Pro
- Samsung Galaxy S21 és S21+ - húszra akartak lapot húzni
- Samsung Galaxy A54 - türelemjáték
- Netfone
- Mobil flották
Ú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 amitnew
né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
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- DDR5 GAMER PC: Új RYZEN 7 8700F/9700X/9800X3D +RTX 4060/5060/4070/5070 +16-64GB DDR5! GAR/SZÁMLA!
- Dell Latitude 7410 Strapabíró Ütésálló Profi Ultrabook 14" -80% i7-10610U 16/512 FHD
- Szép! HP EliteBook 850 G8 Fémházas Multimédiás Laptop 15,6" -65% i7-1185G7 32/512 Iris Xe FHD Magyar
- HP EliteBook 850 G8 Fémházas Multimédiás Laptop 15,6" -65% i7-1185G7 8/512 Iris Xe FHD Magyar
- 512 Gb-os NVME-k
- LG 65" C1 OLED - 4K 120Hz 1ms - NVIDIA G-Sync - FreeSync Premium - HDMI 2.1 - PS5 és Xbox Ready!
- AKCIÓ! Dell Optiplex 5060 TWR számítógép - i5 8500 16GB DDR4 256GB SSD 500GB HDD UHD630 WIN10
- BESZÁMÍTÁS! ASUS A520M R5 5600X 16GB DDR4 512GB SSD RTX 3060Ti 8GB Rampage SHIVA Enermax 650W
- Azonnali készpénzes Sony Playstation 5 lemezes és digitális felvásárlás személyesen/csomagküldéssel
- Tablet felvásárlás!! Apple iPad, iPad Mini, iPad Air, iPad Pro
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged