Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: dword 23. 08. 2016, 11:11:29
-
Ahoj všem, učím se C++, ale nějak cítím že to není ono a hledám inspiraci jak to udělat lépe.
/* obsluhovač všech socketů */
class SocketDispatcher
{
static std::vector<Socket *> sockets;
...
};
/* třída se socketem, umožnující volat callback při příjmu dat */
class Socket
{
void (*cb)(void*, Socket*, void*, size_t) = NULL;
void *cb_param = NULL;
...
}
/* parser příchozích dat JSON protokolu */
class jproto {
void fetch(void *data, size_t len);
bool process(Json::Value &out);
...
};
/* třída s klientem, konstruktor nastaví callbacky, receive_msg příjme data, zparsuje pomocí třídy jproto a poté předá funkci process_msg() */
class client
{
jproto parserů
client(char *ip, uint16_t port, double period);
void receive_msg(void* obj, Socket* s, void* data, size_t len);
void process_msg(Socket* s, Json::Value& msg);
...
}
client::client(char *ip, uint16_t port, double period) : ip(ip), port(port), period(period)
{
uint32_t addr = inet_addr(ip);
s = new Socket(addr, port, PROTO_TCP, true);
if(s->is_valid())
{
s->set_receiver(receive_msg, this);
SocketDispatcher sd;
sd.get()->add(s);
}
}
void client::receive_msg(void* obj, Socket* s, void* data, size_t len)
{
eluclient *_this = (eluclient *) obj;
_this->parser.fetch(data, len);
Json::Value msg;
while(_this->parser.process(msg))
_this->process_msg(s, msg);
}
Funguje to jak jsem chtěl, ale chtěl bych se vyhnout "_this", a také bych případně chtěl vědět, jak napsat callback v třídě Socket tak, aby jsem mohl volat nestatickou členskou metodu jakékoliv třídy. Díky za rady
-
sorry, řádek:
eluclient *_this = (eluclient *) obj;
má být takhle:
client *_this = (client *) obj;
-
Ahoj všem, učím se C++, ale nějak cítím že to není ono a hledám inspiraci jak to udělat lépe.
/* obsluhovač všech socketů */
class SocketDispatcher
{
static std::vector<Socket *> sockets;
...
};
/* třída se socketem, umožnující volat callback při příjmu dat */
class Socket
{
void (*cb)(void*, Socket*, void*, size_t) = NULL;
void *cb_param = NULL;
...
}
/* parser příchozích dat JSON protokolu */
class jproto {
void fetch(void *data, size_t len);
bool process(Json::Value &out);
...
};
/* třída s klientem, konstruktor nastaví callbacky, receive_msg příjme data, zparsuje pomocí třídy jproto a poté předá funkci process_msg() */
class client
{
jproto parserů
client(char *ip, uint16_t port, double period);
void receive_msg(void* obj, Socket* s, void* data, size_t len);
void process_msg(Socket* s, Json::Value& msg);
...
}
client::client(char *ip, uint16_t port, double period) : ip(ip), port(port), period(period)
{
uint32_t addr = inet_addr(ip);
s = new Socket(addr, port, PROTO_TCP, true);
if(s->is_valid())
{
s->set_receiver(receive_msg, this);
SocketDispatcher sd;
sd.get()->add(s);
}
}
void client::receive_msg(void* obj, Socket* s, void* data, size_t len)
{
eluclient *_this = (eluclient *) obj;
_this->parser.fetch(data, len);
Json::Value msg;
while(_this->parser.process(msg))
_this->process_msg(s, msg);
}
Funguje to jak jsem chtěl, ale chtěl bych se vyhnout "_this", a také bych případně chtěl vědět, jak napsat callback v třídě Socket tak, aby jsem mohl volat nestatickou členskou metodu jakékoliv třídy. Díky za rady
Používání raw pointerů je zlo.
-
zboj: nijak jsi mi neporadil, a tvůj názor je subjektivní, pokud nemáš nic k věci, už sem prosím nepiš
-
Co třeba něco takového?
#include <vector>
#include <iostream>
#include <functional>
class Socket
{
public:
std::function<void(const char*, size_t)> callback;
void receive(const char* data, size_t count)
{
callback(data, count);
}
};
class Client1
{
public:
void process(const char* data, size_t count)
{
std::string str(data, count);
std::cout << "client1: " << data << std::endl;
}
};
class Client2
{
public:
void process(const char* data, size_t count)
{
std::string str(data, count);
std::cout << "client2: " << data << std::endl;
}
};
int main()
{
Client1 client1;
Client2 client2;
std::vector<Socket> sockets;
sockets.emplace_back();
sockets.back().callback = std::bind(&Client1::process, client1, std::placeholders::_1, std::placeholders::_2);
sockets.emplace_back();
sockets.back().callback = std::bind(&Client2::process, client2, std::placeholders::_1, std::placeholders::_2);
std::string data1("DATA1");
sockets[0].receive(data1.data(), data1.size());
std::string data2("DATA2");
sockets[1].receive(data2.data(), data2.size());
}
-
Máš nějaký důvod pro upřednostnění callbacku před virtuální metodou nebo lambda funkcí ?
-
Promiň, moc konstruktivní taky nebudu, ale opravdu to není úplně ono... Celý mi to přijde nějaký moc překombinovaný, přepointerovaný a po pravdě zralý na "znovu a lépe". Zboj má s těma pointerama pravdu, já osobně to vidím jako C násilně přešpagetovaný do C++ s použitím OOP za každou cenu...
-
zboj: nijak jsi mi neporadil, a tvůj názor je subjektivní, pokud nemáš nic k věci, už sem prosím nepiš
To není názor a není subjektivní, to je základní pravidlo, které ti buď někdo řekne, nebo se ho bolestně naučíš za chodu. Jak píše kolega výše, ten kód je otřesný, u zkoušky na VŠ bys neprošel, chce to nejdříve se C++ aspoň trochu naučit, než v něm budeš něco psát, takto jen ztrácíš čas svůj i těch, co s tím kódem budou mít kdy do činění. Máš jen dvě možnosti, buď to cele přepíšeš od nuly tak, aby to aspoň na první pohled vypadalo jako rozumný kód v C++, nebo - což je mnohem lepší volba - si pořídíš nějakou elementární knihu o C++ a naučíš se aspoň základy, než se znovu o něco pokusíš.
-
gamer: díky, tohle jsem potřeboval
téma uzavřeno
-
téma uzavřeno
Fakt?
-
téma uzavřeno
Fakt?
Samozřejmě mluvím pouze za sebe, a ano, opravdu! Dostal jsem, pro co jsem tu přišel.
-
téma uzavřeno
Fakt?
Samozřejmě mluvím pouze za sebe, a ano, opravdu! Dostal jsem, pro co jsem tu přišel.
Povedla se ti uzasna vec. Vlakno na foru, ktere se nezvrtlo v trolleni maximalniho kalibru.
-
téma uzavřeno
Fakt?
Samozřejmě mluvím pouze za sebe, a ano, opravdu! Dostal jsem, pro co jsem tu přišel.
Povedla se ti uzasna vec. Vlakno na foru, ktere se nezvrtlo v trolleni maximalniho kalibru.
A přitom to po pořádným trollingu přímo volalo :D
-
téma uzavřeno
Fakt?
Samozřejmě mluvím pouze za sebe, a ano, opravdu! Dostal jsem, pro co jsem tu přišel.
Povedla se ti uzasna vec. Vlakno na foru, ktere se nezvrtlo v trolleni maximalniho kalibru.
A přitom to po pořádným trollingu přímo volalo :D
Pravda, cekal jsem letajici lopaty apod.
Jeste neni pozde, co si myslis o letosni sklizni mrkve?
-
co si myslis o letosni sklizni mrkve?
Dword je taková lopata, že by se s ním dala sklízet mrkev. 8)
-
Pravda, cekal jsem letajici lopaty apod.
Jeste neni pozde, co si myslis o letosni sklizni mrkve?
Hele, nic moc. Zasel jsem jenom jeden řádek a skončil neprotrhaný ve stínu cuket, kterým se letos opravdu dařilo. Takže sklizeň byla pouze pár baby karotek. Ale ty cukety opravdu stály za to, byly a stále jsou ve všem - cuketové bramboráky, cuketové zelí, zapečená cuketa se slaninou a sýrem, cuketa jen tak na grilu... a ještě jich na zahrádce pár mám.
-
Hele, nic moc. Zasel jsem jenom jeden řádek a skončil neprotrhaný ve stínu cuket, kterým se letos opravdu dařilo. Takže sklizeň byla pouze pár baby karotek. Ale ty cukety opravdu stály za to, byly a stále jsou ve všem - cuketové bramboráky, cuketové zelí, zapečená cuketa se slaninou a sýrem, cuketa jen tak na grilu... a ještě jich na zahrádce pár mám.
Neleze ti ta cuketa uz i usima? Pritelkyni na zahradce vyrostly pekne mrkve a spousta dalsich veci. Maji tolik rajcat, ze to i s prarodici nestihaji jist. Ale tesim se na ten jejich cesnek, ten stoji za to.
Jinak ja pestuju jenom papricky. Zatim jenom kvetou, ale i po sebevrazednych tendencich mych rostlinek doufam v urodu. Loni se mi urodila ze sesti rostlin pouze jedna mini papricka, ktera jeste ani nemela seminka.
-
(Ne)zaujatý pozorovatel potom vidí 100 debilů a myslí si o programátorech svoje.
-
Neleze ti ta cuketa uz i usima? Pritelkyni na zahradce vyrostly pekne mrkve a spousta dalsich veci. Maji tolik rajcat, ze to i s prarodici nestihaji jist. Ale tesim se na ten jejich cesnek, ten stoji za to.
Jinak ja pestuju jenom papricky. Zatim jenom kvetou, ale i po sebevrazednych tendencich mych rostlinek doufam v urodu. Loni se mi urodila ze sesti rostlin pouze jedna mini papricka, ktera jeste ani nemela seminka.
Tak ona se ta cuketa dá sníst, když je k ní i maso :) Rajčata nám letos požrala plíseň, když byly ještě malý zelený. A papričky mám taky - napřed za oknem, pak jsem je přestěhoval ven, tam se jim nelíbilo, tak šly zpátky dovnitř. Mám tři rostlinky trinidad scorpion moruga, celkem to vypadá tak na 20 papriček. Tři už uzrály, jednu jsem ochutnal a faaaaaakt síla. Snesu hodně, ale tohle mě opravdu dostalo. Po malým kousku jsem se potil hodinu a rodina ještě druhej den nadávala, že všechno na co sáhnu, to pálí. A to jsem měl asi 10x umytý ruce.
-
(Ne)zaujatý pozorovatel potom vidí 100 debilů a myslí si o programátorech svoje.
Neber to osobně, já ti fandím, jenom to co jsi předvedl byla tragédie. Nečitelná směska něčeho mezi C a C++ s jaksi naroubovaným OOP... Buď se vykašli na C++ a OOP a dělej to v Cčku, nebo zahoď zvyky z C, začni na jednodušších věcech, jestli se chceš C++ učit a postupně se propracuj dál. V tom to jsi poslal jsi totálně zabil 90% "výhod" C++ a OOP. Jinak mimochodem, zkus se soustředit i na nějaké návyky. Ono je sice úplně jedno, jestli napíšeš "char*neco" nebo "char* neco" nebo "char *neco" nebo "char * neco", ale vypadá líp, když to píšeš pořád stejně.
Jinak, nakonec se stejně našla dobrá duše, která ti to překopala celý úplně jinak, což bylo přesně to, co si to zasloužilo.
A mimochodem - ten můj citát se týkal OOP, který jsem ti jako takový nijak nekritizoval, kromě toho, že tam bylo podle mě dodatečně přiroubovaný zcela nevhodným způsobem, protože ti to celý ještě víc znepřehlednilo a prostě to bylo zralý na přepsání.
-
Tak ona se ta cuketa dá sníst, když je k ní i maso :) Rajčata nám letos požrala plíseň, když byly ještě malý zelený. A papričky mám taky - napřed za oknem, pak jsem je přestěhoval ven, tam se jim nelíbilo, tak šly zpátky dovnitř. Mám tři rostlinky trinidad scorpion moruga, celkem to vypadá tak na 20 papriček. Tři už uzrály, jednu jsem ochutnal a faaaaaakt síla. Snesu hodně, ale tohle mě opravdu dostalo. Po malým kousku jsem se potil hodinu a rodina ještě druhej den nadávala, že všechno na co sáhnu, to pálí. A to jsem měl asi 10x umytý ruce.
Moruga je chutove vyborna a ta palivost to jen podtrhne. Pri nastupu na vysku jsem z ni ochutnal platek o tloustce cca 1.5mm a pak jsem se hodinu valel v posteli ve snaze nejak zpohodlnit to co to zpusobilo v zaludku. Rano to bylo v klidu, to uz jsem zvykly :D Jak velkou ji mas? Protoze ja jsem omylem pomichal zrnicka morugy s necim jinym a ted nevim co mi tam roste. Jsou to cca 60cm vysoke rostlinky v truhliku na balkone.
-
Tak ona se ta cuketa dá sníst, když je k ní i maso :) Rajčata nám letos požrala plíseň, když byly ještě malý zelený. A papričky mám taky - napřed za oknem, pak jsem je přestěhoval ven, tam se jim nelíbilo, tak šly zpátky dovnitř. Mám tři rostlinky trinidad scorpion moruga, celkem to vypadá tak na 20 papriček. Tři už uzrály, jednu jsem ochutnal a faaaaaakt síla. Snesu hodně, ale tohle mě opravdu dostalo. Po malým kousku jsem se potil hodinu a rodina ještě druhej den nadávala, že všechno na co sáhnu, to pálí. A to jsem měl asi 10x umytý ruce.
Moruga je chutove vyborna a ta palivost to jen podtrhne. Pri nastupu na vysku jsem z ni ochutnal platek o tloustce cca 1.5mm a pak jsem se hodinu valel v posteli ve snaze nejak zpohodlnit to co to zpusobilo v zaludku. Rano to bylo v klidu, to uz jsem zvykly :D Jak velkou ji mas? Protoze ja jsem omylem pomichal zrnicka morugy s necim jinym a ted nevim co mi tam roste. Jsou to cca 60cm vysoke rostlinky v truhliku na balkone.
V truhlíku za oknem to mám tak 80cm, ale může mít ve skleníku s přehledem přes metr a půl. Já teď jenom přemýšlím, co s těma papričkama vlastně provedu, abych je nějak pěkně využil. Na rodinu můžu zapomenout, ta mi s konzumací nepomůže, přemýšlel jsem udělat něco jako mučíto. Ty první zralý už mám naložený v oleji, ale přece si nebudu dělat takový zásoby oleje :D
-
V truhlíku za oknem to mám tak 80cm, ale může mít ve skleníku s přehledem přes metr a půl. Já teď jenom přemýšlím, co s těma papričkama vlastně provedu, abych je nějak pěkně využil. Na rodinu můžu zapomenout, ta mi s konzumací nepomůže, přemýšlel jsem udělat něco jako mučíto. Ty první zralý už mám naložený v oleji, ale přece si nebudu dělat takový zásoby oleje :D
Jestli chces, muzu ti od nekolika papricek pomoct, seminka se mi budou hodit a koreni uz mi taky doslo. Si je nasusim a pak se rozhodnu co s nimi.
-
Naprosto promrhaný prostor na balkóně. Papriky se nedají hulit.
-
(Ne)zaujatý pozorovatel potom vidí 100 debilů a myslí si o programátorech svoje.
Neber to osobně, já ti fandím, jenom to co jsi předvedl byla tragédie. Nečitelná směska něčeho mezi C a C++ s jaksi naroubovaným OOP... Buď se vykašli na C++ a OOP a dělej to v Cčku, nebo zahoď zvyky z C, začni na jednodušších věcech, jestli se chceš C++ učit a postupně se propracuj dál. V tom to jsi poslal jsi totálně zabil 90% "výhod" C++ a OOP. Jinak mimochodem, zkus se soustředit i na nějaké návyky. Ono je sice úplně jedno, jestli napíšeš "char*neco" nebo "char* neco" nebo "char *neco" nebo "char * neco", ale vypadá líp, když to píšeš pořád stejně.
Jinak, nakonec se stejně našla dobrá duše, která ti to překopala celý úplně jinak, což bylo přesně to, co si to zasloužilo.
A mimochodem - ten můj citát se týkal OOP, který jsem ti jako takový nijak nekritizoval, kromě toho, že tam bylo podle mě dodatečně přiroubovaný zcela nevhodným způsobem, protože ti to celý ještě víc znepřehlednilo a prostě to bylo zralý na přepsání.
A kdo se tě na to ptal? Já jsem si toho všeho co píšeš vědom, to jenom tvoje omezená neukojená egoistická mysl mi to tady musí cpát. Kdybych to nechtěl přepsat, neptal bych se jak to udělat lépe. Sám jsi tu neporadil ani čárku, jak něco udělat lépe, jenom buzeruješ, otravuješ a seješ plevel. Citace je sice vytržená z kontextu, ale perfektně tu sedí. V tom co jsi poslal ty, jsi zabil 100% výhod on-line fóra.
-
A kdo se tě na to ptal? Já jsem si toho všeho co píšeš vědom, to jenom tvoje omezená neukojená egoistická mysl mi to tady musí cpát. Kdybych to nechtěl přepsat, neptal bych se jak to udělat lépe. Sám jsi tu neporadil ani čárku, jak něco udělat lépe, jenom buzeruješ, otravuješ a seješ plevel. Citace je sice vytržená z kontextu, ale perfektně tu sedí. V tom co jsi poslal ty, jsi zabil 100% výhod on-line fóra.
Pokud jsi si byl vědom toho, že jsi to kompletně celý udělal divně a nešikovně, tak jsi měl začít s učením od základů a ne od prostředka. Něco se ti na tvým kódu nezdálo, chtěl jsi vyřešit drobnosti, já ti k tomu řekl svůj názor a nebyl jsem sám. Pokud se ti veřejné názory nelíbí, doporučuji nepsat na veřejně přístupné diskuze.
-
(Ne)zaujatý pozorovatel potom vidí 100 debilů a myslí si o programátorech svoje.
Neber to osobně, já ti fandím, jenom to co jsi předvedl byla tragédie. Nečitelná směska něčeho mezi C a C++ s jaksi naroubovaným OOP... Buď se vykašli na C++ a OOP a dělej to v Cčku, nebo zahoď zvyky z C, začni na jednodušších věcech, jestli se chceš C++ učit a postupně se propracuj dál. V tom to jsi poslal jsi totálně zabil 90% "výhod" C++ a OOP. Jinak mimochodem, zkus se soustředit i na nějaké návyky. Ono je sice úplně jedno, jestli napíšeš "char*neco" nebo "char* neco" nebo "char *neco" nebo "char * neco", ale vypadá líp, když to píšeš pořád stejně.
Jinak, nakonec se stejně našla dobrá duše, která ti to překopala celý úplně jinak, což bylo přesně to, co si to zasloužilo.
A mimochodem - ten můj citát se týkal OOP, který jsem ti jako takový nijak nekritizoval, kromě toho, že tam bylo podle mě dodatečně přiroubovaný zcela nevhodným způsobem, protože ti to celý ještě víc znepřehlednilo a prostě to bylo zralý na přepsání.
A kdo se tě na to ptal? Já jsem si toho všeho co píšeš vědom, to jenom tvoje omezená neukojená egoistická mysl mi to tady musí cpát. Kdybych to nechtěl přepsat, neptal bych se jak to udělat lépe. Sám jsi tu neporadil ani čárku, jak něco udělat lépe, jenom buzeruješ, otravuješ a seješ plevel. Citace je sice vytržená z kontextu, ale perfektně tu sedí. V tom co jsi poslal ty, jsi zabil 100% výhod on-line fóra.
Kašli na ně, jsou to lopaty. Ti budou pořád povídat nesmysly, který včera někde četly, ale samy nic neumí. Každý nějak začínal a začít špatně je dobrý začátek. Nenech se odradit.
-
Kašli na ně, jsou to lopaty. Ti budou pořád povídat nesmysly, který včera někde četly, ale samy nic neumí. Každý nějak začínal a začít špatně je dobrý začátek. Nenech se odradit.
Máš pravdu. Začal úplně nejlíp špatně jak mohl a pokračovat může s tebou. Vem si ho do parády a nauč ho to dokonale po javamenovsku. Už teď mu závidím.
-
A přitom to po pořádným trollingu přímo volalo :D
Pravda, cekal jsem letajici lopaty apod.
Jeste neni pozde, co si myslis o letosni sklizni mrkve?
Copak mrkev, ale JMELÍ!!
-
Copak mrkev, ale JMELÍ!!
Nevim, na to mam Panoramixe, ale ten zrovna dela lektvary pro Asterixe a Obelixe.