- gban: Ingyen kellene, de tegnapra
- VoidXs: Tényleg minden játék optimalizálatlan?
- Hieronymus: Három júniusi képem
- Gurulunk, WAZE?!
- Luck Dragon: Asszociációs játék. :)
- sziku69: Fűzzük össze a szavakat :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Magga: PLEX: multimédia az egész lakásban
- eBay-es kütyük kis pénzért
- Android másképp: Lineage OS és társai
Új hozzászólás Aktív témák
-
b.kov
senior tag
Hát akkor tényleg azt tudom mondani, hogy bekéred az első sorban az adatot, h melyik konstruktornak kell lefutnia, aztán az alapján annyit olvasol std::cin-nel, ahány paraméteres a kiválasztott konstruktor.
Igazából ha nem engednek STL konténereket (meg gondolom algoritmusokat sem), akkor talán ez a legegyszerűbb módszer.
szerk.: a scanf-es megoldás, meg vagdosás sokkal inkább favágómódszernek tűnik nekem
-
-
Dinter
addikt
Van valami scanf-hez hasonló függvény, amivel megadhatom, milyen formában olvassa be az adatokat? Tehát megvan a sorom stringbe beolvasva, a részek tabulátorral elválasztva, és a tabulátorok közötti részt további stringekbe darabolni.
-
-
Dinter
addikt
Sziasztok.
Lenne egy függvényem, amivel txt-be íratnám ki az adatokat, ezerféle variációt kipróbáltam már, de sose csinál semmit..
#include <iostream>
#include <fstream>
...void ment() {
std::ofstream file;
file.open("adatok.txt");
file << "Teszt";
file.close();
} //kiír fájlbaMit rontok el?
-
dobragab
addikt
válasz
jattila48 #4081 üzenetére
Ha capture list van a lambdadban, akkor nem tudod belole siman kikerni a fuggvenypointert. Szerencsere van ra trukk
Ez a standard
signal
-t hivja meg, ami valoban egy pattintott fuggvenypointert var.std::function<void(int)> sh = [capture](int sig) {
std::cout << "Signal " << sig << " caught, captured " << capture << std::endl;
};
signal(SIGINT, tmp_lib::to_fptr(sh, []{}));(#4086) PandaMonium
target()
sem jo, ha objektumot capture-oltel, akkor a target nem lesz soha fuggvenypointer. -
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. -
jattila48
aktív tag
válasz
EQMontoya #4084 üzenetére
Milyen API fv. kezel C++ template-eket 2018-ban? Ne beszélj már butaságokat! Tudod mi az az API? Az egy bináris interfész az op. rendszer felé. C++ -ban forráskód szinten használhatók az ilyen konstrukciók, mert a c++ fordító a template-eket megfelelően lefordítja a template argumentumok típusának megfelelő forráskódra, majd azt bináris kódra. Egy bináris interfész-hez hogy akarod ezt illeszteni?
-
jattila48
aktív tag
válasz
PandaMonium #4082 üzenetére
És szerinted ez az std::function egy 32/64 bites fv. pointer lesz, amit assemblyben call eax -szel meg tudok hívni? Mert szerintem nem, de erre válaszoltam EQMontoyanak is. API fv.-nek szeretném átadni, mint callback fv. pointert, aminek fogalma sincs az std::function mibenlétéről. Az egy objektum, amit a ctor.-a másol a stackre, ha argumentum-ként adod át. Mit kezdjen ezzel egy API fv?
-
PandaMonium
őstag
-
jattila48
aktív tag
válasz
EQMontoya #4080 üzenetére
A CreateThread-et csak példának hoztam. C++ -ban is előjöhetnek hasonló problémák, pl. különböző objektumok (pl. nyomógomb) tfv.-eit mint üzenetkezelő callback fv.-t kell regisztrálni.
Nem kikerülni, hanem megérteni szeretném a problémát, úgyhogy ne a kikerülésére tegyetek javaslatot. Azt nyilván magam is meg tudom tenni, ha arra van szükségem. -
jattila48
aktív tag
válasz
EQMontoya #4077 üzenetére
Lambdát nem tudsz átadni callback fv. pointerként pl. egy CreateThread vagy StartServiceCtrlDispatcher api hívásnak. Ezek egyetlen pointert várnak, a lambda pedig egy C++ nyelvi konstrukció (a mélyben egy névtelen osztály konstruktorral,...), amit az api fv. nem fog tudni értelmezni.
-
jattila48
aktív tag
válasz
jattila48 #4073 üzenetére
Egy szimuláció a következő lehet:
class Akarmi{
public:
Akarmi(int x):a(x){}
int addto(int x){
return a+x;
}
private:
int a;
};
Akarmi *pa;
int closure_func(int x){
return pa->addto(x);
}
void main(int argc,char *argv[]){
pa=new Akarmi(5);
std::cout << closure_func(6);
}A fenti példában closure_func 5-öt ad hozzá az argumentumához. és nem tfv., címe pedig használható lenne callback fv. pointerként. A gond csak az, hogy ha szükségem lenne egy 11-et hozzáadó closure-re is, akkor létre kéne hozni egy globális Akarmi(11) objektumot is (pl. pa11 nevu pointerrel), és definiálnom kéne egy closure_func11-et, ami a pa11-gyel hívja az addto tfv.-t. Ez nem túl jó megoldás. Amikor előző hozzászólásomban azt írtam, hogy futás közben kódot generálnak, akkor arra gondoltam, hogy kb. ezt a konstrukciót hozzák létre. Amikor létrejön az Akarmi(5) objektum, annak címével (mint konstanssal, vagyis a generált kódban ezt a címet "bedrórozva" konstansként használják) legenerálják a closure_func kódot, és closure fv. pointerként pedig visszaadják a röptében generált kód kezdőcímét. Így talán világosabb mire is gondoltam.
Várom a hozzászólásokat! -
jattila48
aktív tag
C++ -ban nincs lehetőség closure definiálásra, az Embarcadero (Borland) azonban megoldotta ezt a __closure kulcsszó bevezetésével. Szerintetek hogy lehetne sima C++ -ban szimulálni a closure-t? A C++ keretein belül nyilván sehogy, erre kellet a __closure kiterjesztés. De vajon hogy oldják ezt meg a mélyben? Szerintem fordítás/linkelési időben ezt nem lehet, valószínűleg futás közben generálják le a closure végrehajtható kódját (legalábbis egy forwarding fv. kódját), és ezt futtatják. Ehhez azonban Windowsban VirtualProtect-tel futtathatóvá kell tenni azt a memóriaterületet, ahová a kód kerül. Mit szólnak ehhez a vírusirtók?
Ha esetleg valaki nem tudja mi a closure: egy objektum tagfüggvényére mutató fv. pointer. Nem azonos a C++ tfv. pointerével, mert az egy sima fv. pointer, ami történetesen az osztály tfv.-re mutat (fordítás idejű konstans), és csak az osztályból létrehozott objektumon keresztül lehet meghívni. A closure azonban az adott objektumot (a this pointert) "magába olvasztva" (mint konstans értéket) tartalmazza, és csak a this pointeren kívüli argumentumok az argumentumai. Ezáltal alkalmassá valik callback fv. pointerként való használatra (ez a lényeg). -
choco01
addikt
Köszi mindnekinek!! Sikerült!!
-
jattila48
aktív tag
A private tagokat nem csak a konstruktor, hanem az összes tagfüggvény eléri. A tagfüggvények elől nincs elzárva a private tag, csak a külső (nem tfv.) függvények elől. Sőt ugyanannak a típusnak másik példánya is hozzáfér a private/protected tagokhoz (pl. egy olyan tfv., ami argumentumban másik ugyanolyan típusú példányt (vagy pointert/referenciát) kap, szintén gond nélkül eléri az argumentumban kapott objektum private/protected tagjait).
-
choco01
addikt
válasz
dabadab #4061 üzenetére
Zsír akkor értem a class és struct közötti különbségeket, köszönöm!
Ugye az nem világos hogy minek csináljak private tagokat ha akkor lényegében azzal nem tudok semmit sem tenni..
az csak van mindentől elszigetelve és kész, a példa kódomban ugye ez van:
private:
kolcsonzes *k;
int db;Na most itt akkor nem sok értelmét látom mert ezzel nem tudok mit kezdeni? Bár ha végig nézem a konstruktorba még is csak hivatkozik a k-ra, akkor a konstruktor még is látja a private dolgokat?
Általában emeltszintű érettségi példák vannak kidolgozva és azokat csináljuk meg..
all:Az miért van hogy mindig dinamikus tömböket használunk amikor tudjuk előre is hogy hány elemű lesz?Azt hiszem néztünk olyan példát előadáson hogy volt benne dinamikustömb de konkrétan megadva az elemszámmal.. vagy ennél a classon témánál mindig ez kell?
Meg ugye a dinamikus tömbkezelésre ezt tanultuk:
<típus>* név = new <típus>[érték];
Most az előző példakódomban ez volt:k = new kolcsonzes[db];
itt se típus se * nincs az elején a másik végén meg típus nincs.. akkor honnan tudja hogy ez dinamikus?jattila48:
Neked is köszönöm, így már kezd összeáállni, valahogy gyakarolnom kéne, próbálok keresni rá még példát a suliban majd..
Így ennél a példámnál értem hogy ezért kell dinamikus meg hogy a beolvasáskor tudjuk meg hogy hány elemű lesz!
-
jattila48
aktív tag
válasz
choco01 #4060 üzenetére
Ahogy b.kov leírta, k a kölcsönzéseket tároló tömb, ami kolcsonzes * típusú (vagyis kolcsonzes tipusu strukturara mutató pointer). Ez azért pointer, (és nem tömb, de tömbként lesz használva), mert előre nem tudod, hogy hány darab kölcsönzést fog tartalmazni (ezt is fájlból olvasod be a db változóba), tömböt deklarálni pedig csak konstans mérettel lehet. Ha megvan hogy hány darab kölcsönzést tartalmaz a fájl, akkor ekkora méretű tömböt fogsz dinamikusan (new-val) lefoglalni, ami kolcsonzes * típusú pointert ad vissza. Talán az okozza a zavart, hogy nem érted miért kell pointer, ha egyszer tömbbe olvasol be. A C-ben (és C++-ban) pointereket lehet tömbszerű szintaxissal használni (ki lehet indexelni mint a tömb elemet), illetve a tömb neve (indexelés nélkül) a tömb kezdőcímét jelenti. A tömb indexelés tulajdonképpen nem más, mint a kezdőcímhez képest indexszel eltolt pointerre való dereferencia. Tehát tomb ugyanaz, mintha *(tomb+i) -t írnál (ez pedig ugyanaz mint *(i+tomb), ami ugyanaz mint i[tomb]; egy kis nyalánkság a C szintaxisból). Ahogy fent írtam, csak a dinamikus helyfoglalás miatt kell pointer, és nem tömb. Ha azt gondolnád, hogy ilyen módon a pointer és a tömb tulajdonképpen ugyanaz, akkor nem lenne egészen igazad, ugyanis a tömb név (mint a tömb kezdő címe) konstans pointer (fordítás idejű konstans), ezért nem lehet neki értéket adni, és nem lehet a címét képezni, ellentétben a pointer típusú változóval. Elég baj, hogy a C-ben a tömb és pointer fogalma így összemosható, ebből szoktak félreértések (és hibák) adódni. Ennyit a tömbökről.
Hogy miért private ez a tömb (pointer), az pedig azért, mert nem feltétlenül kellene a kölcsönzéseket tömbben tárolni (lehetne pl. lista), ezért az osztályod felhasználója nem kell (nem szabad) hogy tudjon az implementációról, számára elég a publikusan biztosított tagfüggvények ismerete, ami az implementációtól függetlenül mindíg ugyanúgy hívható (ez OOP alapelv).
"De most akkor azt is lehetne írni a feltöltéskor hogykolcsonzes[i].datum
;"
Ebben a sorban nem csináltál semmit, egyszerűen a stackre helyezted akolcsonzes[i].datum
értékét.
"hogyan tehetem a private tagokat elérhetővé más számára?"
Leginkább public tagfüggvények által, magát a private adatszerkezetet nem szokás (hiszen ezért private). Ha feltétlenül elérhetővé akarod tenni, akkor legyen public. Előfordulhat azonban, hogy bizonyos külső (free vagyis nem tfv.-ek) függények számára meg akarod engedni a private/protected adattagok elérését, akkor az osztályod ezeket a fv.-eket friend-ként deklarálja (komplett osztályt is lehet friend-ként deklarálni). A friend deklaráció nem esik a public, private, protected láthatóság hatálya alá, mindegy hová írod. Mindíg az az osztály fogadhat barátjának egy fv.-t (vagy másik osztályt), amelyik ezek számára meg akarja engedni a private tagjainak elérését. Nem fordítva, tehát egy külső fv. nem jelentkezhet be, hogy szeretné az adott osztály private tagjait elérni.
A struktúra és az osztály között összesen az a különbség, hogy a struktúra tagjai default public elérésűek, míg az osztályé default private. Vagyis ha nem írsz ki láthatóságot, akkor ez vonatkozik a tagokra. Más különbség nincs, ettől eltekintve teljesen ugyanúgy használhatók. Szokás szerint, ha csak adattagok vannak, akkor struktúrát használnak, ha tfv.-ek is vannak, akkor osztályt, de ez csak konvenció.u.i.: közben míg írtam a választ dabadab megelőzött, kb. ugyanazt válaszolta.
-
dabadab
titán
Egyébként meg most komolyan, char*, C tömbök meg tök felesleges new/delete egy C++-t illusztráló iskolai példaprogramban? Tényleg már csak egy gets() hiányzik.
-
dabadab
titán
válasz
choco01 #4057 üzenetére
"ovábbá ezt sem értem hogy miért nevezzük ezt a konstruktornak: kolcsonzo(char fnev[]); mert hát más is néz ki ehhez hasonlan.. pl.: int GetMagellan();"
Két fontos különbség van a kolcsonzo() meg a GetMagellan() között:
1. a konstruktort pontosan úgyanúgy hívják mint az osztályt
2. nincs visszatérési értéke (még void se)"mivan ha nem csinálok konstruktort hanem csak int kolcsonzo(char fnev[]);-et írok?"
Reklamálni fog a fordító, hogy konstruktornak nem adhatsz meg visszatérési értéket (az meg, hogy konstruktor, onnan jön, hogy pont úgy hívják, mint az osztályt)
-
dabadab
titán
válasz
choco01 #4060 üzenetére
C++-ban a struct meg a class ugyanaz a dolog, két különböző névvel. Az egyetlen különbség a default láthatóság, vagyis ha nem írod ki, hogy public: meg private: (de úgyis kiírod), akkor classnál defaultból minden private, structnál meg minden public. Szóval gyakorlatilag az classt meg a structot lehetne egymás helyett használni (de ne csinálj ilyet, mert csak összezavarsz vele másokat (meg a jövőbeli magadat
)
"meg hogyan tehetem a private tagokat elérhetővé más számára?"
A private pont azért private, hogy ne legyen elérhető más számára
Ha ezt akarod, akkor legyen public, de alapvetően adattagotkat nem jó ötlet publicra rakni, mert akkor mindenki úgy rondít bele, ahogy nem szégyell - inkább legyenek a más osztályok számára érdekes adatok tagfüggvényeken keresztül, mert így egyrészt tudod ellenőrizni az értékadásokat, hogy nem hülyeséget akar-e a másik beleírni, illetve át tudod faragni a belső adatstruktúrát anélkül, hogy emiatt át kellene írni a többi osztályt is.
(A kivétel az, ha tisztán adatokat (függvényeket viszont nem) tartalmazó osztályt kell létrehozni, ott publicra érdemes rakni a tagokat és ezeknél érdemes a struct kulcsszót használni, hogy mindenki elsőre lássa, hogy miről van szó)
-
choco01
addikt
De most akkor azt is lehetne írni a feltöltéskor hogy
kolcsonzes[i].datum;
és a többi? minek akkor ez a k-s dolog..meg hogyan tehetem a private tagokat elérhetővé más számára? valamilyen értékátadásról beszélt a Tanár Úr az egyik órán, de nem értettem teljesen..volt valami friend függvény is..
ezeket csak így elmondják aztán nem használtuk, de azért van..
cattus:
Köszönöm, most belenéztem, de ebbe hogyhogy strukturákon csinálja a private meg public dolgokat..
-
b.kov
senior tag
válasz
choco01 #4056 üzenetére
Ennek a pointernek a segítségével hozod létre az egyes kölcsönzőkhöz tartozó tömböket, amiknek az eleme "kolcsonzes" típusúak. Tehát ha pontosabbak akarunk lenni, akkor azt is lehet mondani, hogy a k pointered ennek a tömbnek a fejelemére mutat. A
k[i]
pedig a fejelemtől i. távolságra lévő elemre.Ennek a pointernek pontosan azért kell privátnak lennie, mivel minden egyes "kolcsonzo" példány létrehozásával egy file-ból olvasod be a kölcsönzéseket. Ezek ugye statikus adatok, amiken később nem szeretnél vátloztatni. Tehát ne lehessen azt mondani, h pl. "mintaKolcsonzo" objektumon keresztül, a 3. kolcsonzés idejét megváltoztatod. Tehát:
kolcsonzo mintaKolcsonzo("inputFile_1");
Ekkor beolvasod ugye a fájlból a statikus adatokat. Nem lenne jó, ha ezután tudnál ilyet csinálni:
mintaKolcsonzo.k[2]->datum = "Buddha szobor";
Persze létezik igény fájlból beolvasott adatok utólagos módosítására (sőt), viszont ez akkor sem szép megoldás. Arra külön setter függvényeket szokás írni, csakúgy mint a mostani getter függvények.
Tehát az előző példában ha megengednénk a dátum módosítását, akkor így lenne mondjuk szép:
mintaKolcsonzo.modifyDate(2, "2018.02.03");
Ahol ez első paraméter a kölcsönzés száma, a második pedig az új kölcsönzési dátum. -
choco01
addikt
válasz
choco01 #4056 üzenetére
Továbbá ezt sem értem hogy miért nevezzük ezt a konstruktornak:
kolcsonzo(char fnev[]);
mert hát más is néz ki ehhez hasonlan.. pl.:int GetMagellan();
és akkor ehhez is lehetne egy~GetMagellan();
-t destruktornak írni..? mivan ha nem csinálok konstruktort hanem csakint kolcsonzo(char fnev[]);
-et írok?bocs a dupláért..
-
choco01
addikt
Igen van továbbra is az ami az elején..
ez a *k dolog azaz hogy
kolcsonzes *k;
sor miért kell a privátba?
a kolcsonzes struktúrára mutat a k? vagy hogy értelmezzem?mert utána visszatér ugye az előbb írt kódban a
k = new kolcsonzes[db];
meg utána a feltöltés is a k-ra megy.. -
b.kov
senior tag
válasz
choco01 #4054 üzenetére
Ha van valami konkrét kérdésed, akkor írd nyugodtan, de egyébként jól látod szerintem a dolgokat.
Ha nincs öröklődés, akkor a protectedet felejtsd el egy kicsit, és csak a public-private részre koncentrálj.Nagyon egyszerűen tényleg csak annyi a dolog, hogy a privát adattagokhoz/függvényekhez kintről (az osztály példányain keresztül) nem lehet közvetlenül hozzáférni. Ez ugye az enkapszuláció lényege, előttem jól meg lett fogalmazva.
-
choco01
addikt
Most ilyen speedrun megy mert holnap írunk ZH-t és leragadtam a struktúráknál, de elvileg kötelező lesz osztályokat használni..
úgy hogy amennyit csak tudok olvasok..
A gyakorló feladat ilyesmi volt, végülis értem, csak pár apró része nem világos hogy miért oda miért nem, eddig úgy gondoltam hogy a private/protected rész arra kell hogy mások elől védjem az ott lévő dolgokat és akkor valahogy publicba tudok infót adni a védett részbe is..de aztán lehet nem..
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
/*Készítsen programot, melyben a Kétkerék nevű kerékpár kölcsönző adatait tudja kezelni.A kölcsönzőben kétféle
típusú kerékpár van, melyek kölcsönzési óradíja különböző.A magellan 1200 Ft / óra, a median 1000 Ft / óra.
A kolcsonzo.txt szöveges állomány első sorában a kölcsönzések számát, a kölcsönzések adatait a következő struktúra szerint tartalmazza:
struct kolcsonzes
{
string; //a kölcsönzés napja
string tipus; //a kerékpár típusa
int sorszam; //a kerékpár sorszáma
int ido; //a kölcsönzés ideje
};
Készítse el az alábbi függvényeket, mindegyik függvény vegye át az állomány nevét :
Getdb() Adja vissza az adatok számát.
GetMagellan() Adja vissza a magellan kerékpárok számát.
GetMedian() Adja vissza a median kerékpárok számát.
MedianBevetel() Adja vissza a median kerékpárokkal szerzett bevétel összértékét.
OsszBevetel() Adja vissza a bevétel összértékét.
LeghosszabbKolcsonzes() Adja vissza a leghosszabb kölcsönzés adatait tartalmazó struktúrát.
Kiir() A függvény minden adatot sorszámozva, az kiíratja a képernyőre táblázatos formában, minden struktúra egy
sorba kerüljön(a sorszám 1 - ről indul).
*/
struct kolcsonzes
{
string datum;
string tipus;
int sorszam;
int ido;
};
class kolcsonzo
{
private:
kolcsonzes *k;
int db;
public:
kolcsonzo(char fnev[]);
~kolcsonzo();
int Getdb();
int GetMagellan();
int GetMedian();
int MedianBevetel();
int Osszbevetel();
int LeghosszabbKolcsonzes();
void Kiir();
};
//kolcsonzo.txt beolvasasa
kolcsonzo::kolcsonzo(char fnev[])
{
ifstream be(fnev);
if (be.fail()) { cerr<<"hiba fajlnyitas"; system("pause"); exit(-1);}
be >> db;
k = new kolcsonzes[db];
if (k == 0) { cerr << "hiba2";system("pause");exit(-2);}
for (int i = 0; i < db; i++)
{
be >> k[i].datum;
be >> k[i].tipus;
be >> k[i].sorszam;
be >> k[i].ido;
}
be.close();
}
kolcsonzo::~kolcsonzo()
{
if (k != 0)
delete[]k;
}
int kolcsonzo::Getdb()
{
return db;
}
int kolcsonzo::GetMagellan()
{
int m = 0;
for (int i = 0; i < db; i++)
{
if (k[i].tipus=="magellan")
{
m++;
}
}
return m;
}
int kolcsonzo::GetMedian()
{
int m = 0;
for (int i = 0; i < db; i++)
{
if (k[i].tipus=="median")
{
m++;
}
}
return m;
}
int kolcsonzo::MedianBevetel()
{
int mbev = 0;
for (int i = 0; i < db; i++)
{
if (k[i].tipus=="median")
{
mbev += k[i].ido * 1000;
}
}
return mbev;
}
int kolcsonzo::Osszbevetel()
{
int bev = 0;
for (int i = 0; i < db; i++)
{
if (k[i].tipus=="median")
{
bev += k[i].ido * 1000;
}
else
{
bev += k[i].ido * 1200;
}
}
return bev;
}
int kolcsonzo::LeghosszabbKolcsonzes()
{
int l = k[0].ido;
for (int i = 0; i < db; i++)
{
if (k[i].ido > l)
{
l = k[i].ido;
}
}
return l;
}
void kolcsonzo::Kiir()
{
cout << setw(14) << "datum" << setw(20) << "tipus" << setw(10) << "sorszam" << setw(10) << "kolcsido" << endl;
for (int i = 0; i < db; i++)
{
cout << i + 1 << "." << setw(12) << k[i].datum << setw(20) << k[i].tipus << setw(10) << k[i].sorszam << setw(10) << k[i].ido << endl;
}
}
int main()
{
kolcsonzo ketkerek("kolcsonzo.txt");
cout << "Az allomanyban levo adatok:\n";
ketkerek.Kiir();
cout << endl;
cout << "A kolcsonzesek szama: " << ketkerek.Getdb() << endl;
cout << "A magellan kolcsonzesek szama: " << ketkerek.GetMagellan() << endl;
cout << "A median kolcsonzesek szama: " << ketkerek.GetMedian() << endl;
cout << "A median kerekparokkal szerzett bevetel: " << ketkerek.MedianBevetel() << endl;
cout << "A kerekparokkal szerzett osszbevetel: " << ketkerek.Osszbevetel() << endl;
cout << "A leghosszabb kolcsonzes ideje: " << ketkerek.LeghosszabbKolcsonzes() << endl;
cout << endl << endl;
cout << "***************** dinamikus objektum *****************\n\n";
kolcsonzo *kektura = new kolcsonzo("kolcsonzo.txt");
if (kektura == 0)
{
cerr << "keves a memoria 2";
return 2;
}
cout << "Az allomanyban levo adatok:\n";
(*kektura).Kiir();
cout << endl;
cout << "A kolcsonzesek szama: " << kektura->Getdb() << endl;
cout << "A magellan kolcsonzesek szama: " << kektura->GetMagellan() << endl;
cout << "A median kolcsonzesek szama: " << kektura->GetMedian() << endl;
cout << "A median kerekparokkal szerzett bevetel: " << kektura->MedianBevetel() << endl;
cout << "A kerekparokkal szerzett osszbevetel: " << kektura->Osszbevetel() << endl;
cout << "A leghosszabb kolcsonzes ideje: " << kektura->LeghosszabbKolcsonzes() << endl;
cout << "Az 5 oranal hosszabb kolcsonzesek:\n";
delete kektura;
system("pause");
return 0;
} -
b.kov
senior tag
válasz
choco01 #4052 üzenetére
Nem rosszabb semmivel, azonban ekkor a stack-en jön létre az objektum, ahogy írták is korábban.
Amíg nem indokolt pointerek használata, addig egyébként is érdemes kerülni őket. Majd ha belemerülsz jobban a témába, és szembe jön veled a dinamikus kötés, referencia szerinti paraméterátadás, öröklődés, stb... akkor érdemes foglalkozni jobban a pointerekkel is. Addig tanulgatni teljesen jó ez a módszer is, ahogyan most csinálod.
-
jattila48
aktív tag
válasz
choco01 #4050 üzenetére
tanulo.nev = "Tamas";
helyetttanulo->nev = "Tamas";
sorral próbálkozzál. Úgy jónak kell lenni. Mivel new-val hoztad létre az objektumot, egy erre mutató pointert kaptál vissza (mint ahogy helyesen így is deklaráltad a tanulo változót), aminek a tartalma (*tanulo) maga az objektum, és ennek van nev nevű adattagja. Ezért így is írhattad volna:(*tanulo).nev = "Tamas";
De mivel annyira gyakori konstrukcióról van szó, a rövidség kedvéért err bevezették a -> operátort. -
choco01
addikt
válasz
PandaMonium #4049 üzenetére
Köszönöm, nagyon minimálisan kapizsgálom, próbáltam keresni ilyenekt, pl. ezt, de továbbra is úgy érzem hogy a kicsit bonyolultabb helyezetknél nem értem mi értelme..
ezen az oldalon ugye írja ezt:
Nézzünk mindjárt egy kis kódot:
class Student {
string name;
}
Ez egy osztály. Ha ezt az osztályt szeretnénk használni, azt példányosítással tehetjük meg. Nagyjából így:Student student = new Student();
student.name = "János";
Vagyis az osztályt úgy képzelhetjük el, mint egy tervrajz. A tervrajz alapján csinálunk egy konkrét példányt.Vagyis a tervrajzot, az osztályt használva, létrehozhatunk több példányt is:
Student mintaJozsef = new Student();
mintaJozsef.name = "Minta József";Student mintaBela = new Student();
mintaBela.name = "Minta Béla";Na most nekem ezt még sem fogadja el:
#include<iostream>
#include<string>
using namespace std;
class iskola
{
public:
string nev;
};
int main()
{
iskola *tanulo=new iskola();
tanulo.nev = "Tamas";
system("pause");
return 0;
}se csillaggal, se anélkül..
-
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.
-
choco01
addikt
Ehhez a osztályos, kontruktoros, destruktoros témához van valakinak valami részletes példákkal tarkított jegyzete? Már vagy 5-6 könyvet átnéztem de így sem értem hogy ezt miért így kellet..
a struktúrát értem, azt hogy miért kell ez a kolcsonzes *k a privátba azt már nem..
struct kolcsonzes
{
string datum;
string tipus;
int sorszam;
int ido;
};
class kolcsonzo
{
private:
kolcsonzes *k;
int db;
public:
kolcsonzo(char fnev[]);
~kolcsonzo();
int Getdb();
int GetMagellan();
int GetMedian();
int MedianBevetel();
int Osszbevetel();
int LeghosszabbKolcsonzes();
void Kiir();
}; -
jattila48
aktív tag
válasz
jattila48 #4044 üzenetére
Ha egyáltalán nem definiálsz copy ctor-t, akkor a fordító generál. Ez valószínűleg jó is lesz neked, mivel nem írtál destruktort. Az értékadó operátor hasonlóan. Egyébként ezt a három fv.-t (copy ctor, értékadó operátor, destruktor) általában vagy mindet definiálja a programozó, vagy egyiket sem.
-
jattila48
aktív tag
válasz
kemkriszt98 #4043 üzenetére
De hát leírtam, hogy nem hívódik. Definiálni kell a megfelelő copy ctort a fv. visszatérési értékének létrehozásához, de a copy elision miatt NEM hívódik meg. Ez azért lehet így, mert az optimalizálás (copy elision) a fordítás után egy későbbi fázosban történik, a fordító pedig előre nem tudja, hogy majd lehetséges lesza alkalmazni a copy elision-t, ezért biztos ami biztos, megköveteli a copu ctor definiálását.
-
kemkriszt98
tag
-
jattila48
aktív tag
válasz
kemkriszt98 #4041 üzenetére
A második esetben az értékadó operátorod hívódik meg (ami szintén nem egészen jól van megírva, ld. az előző kommentemet). Viszont az A::initFromFile függvényed érték szerint ad vissza A típusú objektumot (egyébként vissza adhatná new-val létrehozott objektum címét is, vagy még jobb, ha unique_ptr-ben adja vissza), aminek a létrehozásához mindenképpen szükség van a copy ctor.-ra. Látni kéne ezt a fv.-t, mert lehet, hogy a visszatérő értéket nem bal értékből állítja elő (pl. return A() formában valamilyen ctor.-ral, ahol a ctor.-ral létrehozott objektum a fv. törzsében temporális lesz), ez esetben pedig a stack-en történő visszatérő érték létrehozásához a const A& argumentumú copy ctor-ra van szükség. Megjegyzendő, hogy a modern C++ fordítók ilyen esetben a copy elision nevezetű optimalizálást fogják végrehajtani, vagyis valójában nem hívják meg a copy ctort, hanem egyből a stacken mint visszatérő értéket hozzák létre a szóban forgó temporálist. Ennek ellenére a megfelelő copy ctor definiálását megkívánják. Összefoglalva: valószínűleg az initFromFile fv.-ed visszatérő értékének létrehozásához követeli meg a fordító a megfelelő copy ctort.
-
kemkriszt98
tag
válasz
jattila48 #4040 üzenetére
Én ezt tényleg értem.. csak azt nem értem, hogy ha tettem, egy breakpointot a cpy. konstruktroba, és az előző kommentemben írt sornál nem állt meg, tehát nem hívódik copy konstruktor, hanem feltételezem az = operátor, akkor miért hisztizik a fordító, hogy nincs megfelelő konstruktor?
-
jattila48
aktív tag
válasz
kemkriszt98 #4039 üzenetére
Ahogy EQMontoya mondta, a copy ctor.-nak A(const A&), az értékadó operátornak pedig A& operator=(const A&) típusúnak kell lenni. Mivel neked ilyen ctor.-od nem volt, ezért szólt a fordító. Amit te írtál az is copy ctor, csak a programodban nem volt megfelelő, mert a változót A::initFromFile("asd") fv.-el akartad inicializálni, aminek a visszatérő értéke nem balérték (nem lehet neki értéket adni, nem lehet a címét képezni,... A fv.-ek visszatérő értékei nem balértékek, hanem csak temporálisok). A C++ szabvány szerint nem balérték pedig csak konstans referenciához köthető. Ezért nem volt jó a te copy ctor.-od, és ezért jó a const referencia argumentumú copy ctor. Ugyanígy az értékadó operátorra is. Ha az inicializálás/értékadás jobboldalán nem fv. visszatérési értéke lenne, hanem egy közönséges változó (balérték), akkor a te ctor.-os és értékadó operátorod is jó lenne. Egyébként milyen fordítót használsz? Mert a MSVC a szabványtól eltérően megengedi nem balérték nem const referenciához kötését. Lehet, hogy azzal működne a programod.
Nem próbáltam ki, de szerintem itt lehet a baj. -
-
EQMontoya
veterán
válasz
kemkriszt98 #4037 üzenetére
Ezt nem siekrült felfognom. Melyik esetben mi nem hívódik?
A const referencia paraméter pedig természetesen vonaktozik az operator=-re is.
-
EQMontoya
veterán
válasz
kemkriszt98 #4035 üzenetére
A copy konstruktorodnak referencia szerint (és konstansként) kellene átvennie a paramétert.
-
kemkriszt98
tag
Sziasztok,
A következő kérdésem lenne:
Adott egy osztály(leegyszerüsítve) :class A{
valami* b;
int n;
...
public:
A();
A(A&);
~A();
static A initFromFile(string);
void operator=(A);
...getters/setters...
}És persze a hozzá tartozó implementációk. Most nem írom be, hogy ne legyen túl hosszú de ha szükséges, azonnal pótolom.
A copy constructor és az operator is annyit csinál, hogy a paraméterben kapott objektum n-jét felhasználva lefoglal helyet és átmásolja a sorozat elemeit.
Na már most a probléma az, hogy valahol a kódban deklarálok egy A objektumot majd később probálom értékül adni neki az initFromFile által visszatérített objektumot.. két féle képpen próbáltam:
A a = A::initFromFile("asd");
eredetiAvaltozo = a;és
eredetiAvaltozo = A::initFromFile("asd");
Mind a kétszer ugyan azt a hibát adja a fordító, hogy nincs megfelelő konstruktor.
Az első esetben sejtem, hogy valami olyasmi lehet a baj, hogy a copy konstruktor hívódna, csak az cím szerint várja a értéket, és a függvény visszatérési értékét nem lehet címszerint átadni. Ha igazam van ( vagy legalább közel járok) akkor megmondaná valaki, hogy erre mi a megoldás? Ha tévedek akkor meg azt, hogy akkor mi a probléma...A második esetet egyáltalán nem értem.. ott olyasmi folyik a háttérben amiről fogalmam sincs
A hiba egyébkén mindkét esetben a függvény hívásának sorában jelentkezik, nem benne vagy ilyenek..Előre is kösz a segítséget.
-
#74220800
törölt tag
Hi!
Egy vector<int>ben tarolom egy matrix ertekeit. A matrix kiiratasat szeretnem megoldani. Alapbol ha minden egyjegyü, ket forciklussal, sortöressel, az elemek utan egy space-t hagyva müködik a dolog. De azt hogyan tudom megoldani legegyszerübben, hogy különbözö jegyü ertekek eseten se csusszanak el sorok?
Pls help.
-
dangerzone
addikt
válasz
m.zmrzlina #4028 üzenetére
Köszi srácok!
-
m.zmrzlina
senior tag
válasz
dangerzone #4026 üzenetére
Emelt szintű informatika érettségi programozás feladatok megoldásai itt és itt
Itt több mindenből kell kihámozni a programozás feladatokat és csak kevés van c++ -ban megoldva de lehet itt is keresgé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.
-
dangerzone
addikt
Sziasztok!
Ismertek olyan weboldalt esetleg, ahol vannak gyakorlati példák, feladatok kezdő szintű C++ programozáshoz?
-
válasz
PandaMonium #4024 üzenetére
Koszi!
-
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.
-
mgoogyi
senior tag
Szia,
Próbáld lényegretörően feltenni itt a kérdéseid, miután már úgy érzed, hogy egy adott dologgal nem jutottál magadtól előre. Én csináltam skype-pal, de ha annyit kérek, hogy nekem megérje, neked nem fogja.
A legtöbbet az számít, hogy mennyi időt ölsz a dologba. Csak azzal, hogy egyszer vagy kétszer elmondanak valamit, még nem fogod tudni hatékonyan alkalmazni. Rengeteg gyakorlásra van szükség és az egyetemek is ebben a szellemben oktatják. -
#hpq
aktív tag
Sziasztok!
Az lenne a kérdésem, hogy innen valaki nem vállal C++ oktatást személyesen vagy akár skypen? (Természetesen nem ingyen gondoltam.) Egyetemen most kezdtük el és levelező szakon nem egy nagy óraszámba foglalkozunk vele, hogy hatékonyan megértsem a feladatokat. Még a beadandók megírása is problémát okoz, elég sok idő elmegy mire megértek egy-egy összefüggést nem, hogy az éles vizsga.
Nagyon megköszönném, ha valaki tudna segíteni! -
-
válasz
dabadab #4018 üzenetére
Szuper, maris ravilagitottal arra, hogy eloszor valasztanom kell a ket irany (C vagy C++) kozott.
Leginkabb olyan dolgokkal szeretnek foglalkozni, mint a kodekek, screen grabbeles, es 3D-s megjelenites.
Jatekokkal nem hiszem, hogy lesz eselyem foglalkozni, de orvosi, vagy autos kepalkoto teruleten el tudnam kepzelni a jovomet.
Az a lenyeg, hogy olyan teruletek erdekelnek, ahol a szoftver futasi teljesitmenye is fontos szempont, illetve szemmel jol lathato eredmenye van a munkamnak: pl. szebb elsimito eljaras, vagy azonos hardveren jobban futo 3D objektum megjelenites, netan pontosabb targy felismeres pl. onvezeto autos teruleten, stb.
Eleg jo vagyok matekbol, es fizikabol, igy ezeket is szeretnem hasznalni, mert a vegen elkopoik a tudasom.Az eddigi kutakodasaim alapjan, amit en szeretnek csinalni, azok inkabb library-k formajaban leteznek, amiket be lehet huzni mas projecktekbe. De ebben meg nem vagyok teljesen biztos.
Neztem tobb ide vago allas hirdetest, de nehol C, nahol meg C++-t kernek, latszolag hasonlo temaju feladatokhoz. Ezek szerint mindket nyelvet hasznaljak ilyen a feladatra?
-
dabadab
titán
"Szeretnek elkezdeni C-vel es/vagy C++-szal foglalkozni."
Ez egy kicsit olyan, mintha azt mondanád, hogy szeretnél szakács lennie vagy szoftverarchitekt, mert mindkettő ugyanazzal a betűvel kezdődik
"Jelenleg JS-ben dolgozom, es neha JAVA-ban, de inkabb az alacsonyabb szintu vilag jon be jobban."
A modern C++ gyakorlatilag semennyivel sem alacsonyabb szintű, mint a Java, a C meg tulajdonképpen hordozható assembler - melyik érdekel igazán?
"Elsosorban a kep megjelenites erdekel, OpenGL/CL-tol kezdve a videokonvertalasig a jatekmotorokon at, igy ezt a teruletet szeretnem megcelozni, nyilvan fokozatosan."
Az OpenCL az meg egy harmadik és negyedik nyelv
"mennyire realis, hogy munkaidon kivul osszereakott referenciak alapjan talaljak melot C/C++ teruleten, ha a munkaban, tok mas nyelvekkel dolgoztam csak?"
A C++ azért (csakúgy, mint a Java) tipikusan nagyprojektes nyelv, azt meg házi környezetben nehéz reprodukálni, mert egy csomó feature-nek akkor lesz értelme, ha elég nagy a kód. Itt persze a javás tapasztalatod segíthet, mert ott is hasonló dologokkal lehet találkozni.
C-s meló meg tipikusan hardverközeli szokott lenni, ott elektronikai ismeretek meg hasonlók szoktak jól jönni.
Amúgy meg persze munkaerőhiány van, szóval ha akarsz, akkor találsz munkát azon a területen, amit kinéztél.
-
Sziasztok!
Szeretnek elkezdeni C-vel es/vagy C++-szal foglalkozni.
Jelenleg JS-ben dolgozom, es neha JAVA-ban, de inkabb az alacsonyabb szintu vilag jon be jobban.
Elsosorban a kep megjelenites erdekel, OpenGL/CL-tol kezdve a videokonvertalasig a jatekmotorokon at, igy ezt a teruletet szeretnem megcelozni, nyilvan fokozatosan.
Az lenne a kerdesem, hogy hol talalom a legjobb leirasokat.
Nem konreten a szintaktikat, es nyelvi sajatossagokat keresek most, mert arra rengeteg netes leirast, konyvet talaltam, inkabb best practice-eket, es hasonlokat.Illetve egy bonusz kerdes, akik kepben vannak a mostani felveteli kovetelmenyekkel: mennyire realis, hogy munkaidon kivul osszereakott referenciak alapjan talaljak melot C/C++ teruleten, ha a munkaban, tok mas nyelvekkel dolgoztam csak?
mod: Áhh, most latom, hogy van kulon C topik is. Igazabol lehet, hogy oda kellett volna raknom, de hátha itt is jo helyen van a kerdesem.
Kossz!
-
thiclyoon
aktív tag
válasz
dabadab #4013 üzenetére
Tudom, csak az kicsit kihaltabb, gondoltam itt aktívabbak vagytok
Tipikusan persze ahogy kiírtam ide, találtam is egy helyet, ahol azt írták amit te is a NULL-ról, szóval így már nem száll el
Kiíratásnál többféle lehet (amit írtam, az L(eft)-N(ode)-R(ight)), és mivel az adott fában itt "balra" kerülnek a kisebb elemek, "jobbra" a nagyobbak, így növekvő sorrendben fogja kiírni elvileg, és valóban így írja ki, szóval ez okésnak tűnik
+ meglett a db-szám is, ott a return-ben kellett kicsit ügyeskedni, nem magában a kódban. Találtam még néhány elég érdekes feladatot, de most már inkább szenvedek egy kicsit még a rekurzióval, hátha rájövök
-
m.zmrzlina
senior tag
Ez sem kifejezetten C++ kérdés de gondolom nem ismeretlen a probléma.
Több(2) monitoros konfig esetén hogyan lehet beállítani, hogy a konzolablak ne az elsődleges, hanem a másodlagos monitoron jelenjen meg alapértelmezetten?
-
dabadab
titán
válasz
thiclyoon #4012 üzenetére
Amit írsz, az színtiszta C kód, nem C++, szóval rossz topikban vagy
"Futtatáskor a végén (del után) a Head ide mutat: 00794D38 (miért nem nullptr? nem az kéne legyen free után?)"
Azért nem NULL, mert soha nem adsz neki NULL értéket, kellene bele egy új sor (a left meg a right nullázása amúgy is elég felesleges, de ezután duplán az lesz):
free(*Head);
*Head = NULL;(És pont ez a hiányzó sor az, ahol értelmet nyer a duplapointer, mert a meglévő kódhoz egy sima pont *Head is elég lenne.)
Így első blikkre fogalmam sincs, hogy a kiíró függvényed miért pukkan el, de az elég furcsa, hogy a jobb és a bal oldal kiírása között írod ki az adott csomópont értékeit.
-
thiclyoon
aktív tag
Sziasztok!
Nem rég óta tanulom a C-t és a C++-t. Jelenleg bináris fákkal szórakozok egy ideje, előkerült néhány probléma. Pl. hogyan tudom megszámolni, hogy egy fában hány elem van? (Igazából az átlagukra is szükség lenne, szóval az összeg is kérdéses (egy elem többször is szerepelhet, a db is tárolva van), de azt jobban el tudom képzelni.)
Valamint kódszinten is elvesztem (vagy a kiíratással, vagy a törléssel van a gond. Addig bütyköltem, hogy már teljesen belezavarodtam - átnéztem már stackoverflow-ra és még néhány oldalra is), ha van ötletetek mi a ludas, várom a tanácsokat
(Furcsa lehet a pointer-pointer, de a teljes törléshez szerintem ez kéne. Ja és remélem érthető a kód azért.)
void del(pont ** Head)
{
if (*Head != NULL)
{
del(&((*Head)->Left));
del(&((*Head)->Right));
(*Head)->Left = NULL; //kerdeses hogy kell-e
(*Head)->Right = NULL; //szinten
free(*Head);
}
return;
}illetve
void kiir(pont * Head)
{
if (Head == NULL)
{
return;
}
if (Head->Left != NULL)
{
kiir(Head->Left);
}
printf("%d, %d-szor\n", Head->adat, Head->darab);
if (Head->Right != NULL)
{
kiir(Head->Right);
}
return;
}Futtatáskor a végén (del után) a Head ide mutat: 00794D38 (miért nem nullptr? nem az kéne legyen free után?), valamint nincs se error se warning, csak futás idejű hiba: Exception Thrown (az
if (Head->Left != NULL)
sorban akiir
függvényben). Köszönöm előre is, minden tanács jól jön! -
-
dobragab
addikt
válasz
m.zmrzlina #4008 üzenetére
En Linuxon CLion-t hasznalok, Windowson pedig Visual Studio-t clang toolsettel, es ReSharperrel. Mint IDE, a VS + ReSharper szerintem hangyanyival jobb, plusz gyorsabb es kevesebb ramot zabal. A VS-nel a clang-et is picit mokolni kell, hogy jol mukodjon.
A Visual Studio ReSharper nelkul egy nagyobb projekten mar kinszenvedes, gyotrelmesen lassu az IntelliSense, es nagyon keves funkcioja van az elozo kettohoz kepest.
Ha egyetemista vagy, Jetbrains termekeket (CLion, ReSharper) ingyenesen megkaphatod, ha megfelelo email cimmel regisztralsz. Nalunk a BME-VIK-en pl. automatikusan mukodik.
-
b.kov
senior tag
válasz
m.zmrzlina #4008 üzenetére
Ha ingyenes, és jó IDE-t szeretnél használni, akkor Windowson van Visual Studio, amiben tudsz C++ alkalmazásokat készíteni.
Én Linuxon/macOS-en semmi ingyeneset nem használok, inkább parancssor, vagy CLion, ami nem ingyenes.De egyébként kisebb programokhoz felesleges IDE-vel bajlódni szerintem, hacsak nem szeretnéd elsajátítani az adott fejlesztői környezet tulajdonságait.
-
m.zmrzlina
senior tag
válasz
EQMontoya #4004 üzenetére
A világért sem szeretnék hitvitát generálni de ha már itt tartunk van e konszenzus (tudom nincsen) a szakmában hogy melyik ingyenes IDE-vel érdemes bajlódni (vagy mondjuk melyik hárommal)? Igen tudom, hogy a szakma nem ingyenes fejlesztőkörnyezeteket használ de mégis nagyobb rálátásotok van a témára mint pl a Pékek Országos Szakmai Fórumának.
Félreértés ne essék tudok guglizni (noha nagyon nem a barátom) inkább tapasztalatok érdekelnének. Egészen onnan hogy text editor >> parancssorból fordítás odáig hogy színes szagos IDE mindenféle kényelmi funkcióval.
-
m.zmrzlina
senior tag
válasz
PandaMonium #4006 üzenetére
Közben kiderült, hogy a linuxos verziónál viszont nem volt bekapcsolva a -std=c++11 flag.
Ezzel a módosításal le is fordul.Köszönöm a segítséget.
-
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.
-
m.zmrzlina
senior tag
válasz
EQMontoya #4004 üzenetére
Akkor valamit nagyon elszúrok:
Ez van linux alatt:
xenon@xenon-P5QL-PRO /usr/bin $ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609Ez a kód:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "1234";
int i = stoi(s);
return 0;
}A hibaüzenet itt is ugyanaz:
error: 'stoi' was not....stb...stb....
-
EQMontoya
veterán
válasz
m.zmrzlina #4003 üzenetére
Szerezz be egy tisztességes fejlesztőkörnyezetet, amiben van használható fordító.
GCC 4.9.2 Linuxon amúgy hibátlanul lefordítja. -
b.kov
senior tag
válasz
m.zmrzlina #4001 üzenetére
Esetleg próbáld meg ugyanezt a kódot parancssorból fordítani, -std=c++11 flaggel.
-
m.zmrzlina
senior tag
válasz
PandaMonium #4000 üzenetére
Ez az eredmény:
D:\c++\xxxxxxxxxx\main.cpp|73|error: 'stoi' is not a member of 'std'|
Ú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!
- ZBook Fury 16 G9 16" FHD+ IPS i7-12850HX RTX A2000 32GB 512GB NVMe magyar vbill ujjlolv IR kam gar
- AKCIÓ!!! GAMER PC: Új i5-14400F +RTX 4060/5060/4070/5070 +16-64GB DDR4! GAR/SZÁMLA! 50 FÉLE HÁZ!
- Elite Dragonfly G3 13.5" FHD+ IPS érintő i5-1235U 16GB 512GB NVMe ujjlolv gar
- Újszerű 17.3" FHD (1920x1080) IPS 40pin 144Hz matt LED kijelző. AUO B173HAN04.9
- Lenovo kezdő laptop (i3 6th, 500 GB, 4 GB) reklámáron! AkciÓÓ!
- Lenovo Thinkpad P16 G2 - i9-13980HX, 64GB, 1TB SSD, 16" WQUXGA (3840 2400), RTX 4090 (ELKELT)
- Gyors, Precíz, Megbízható TELEFONSZERVIZ, amire számíthatsz! Akár 1 órán belül
- Dell D6000 univerzális dokkoló USB-C/ USB-A, DisplayLink & Dell WD15 (K17A) USB-C + 130-180W töltő
- Bomba ár! Lenovo ThinkPad X260 - i5-6G I 8GB I 256GB SSD I 12,5" HD I HDMI I CAM I W10 I Gari!
- LG 32GS95UE - 32" OLED / UHD 4K / 240Hz - 480Hz & 0.03ms / 1300 Nits / NVIDIA G-Sync / AMD FreeSync
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest