Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: dword 23. 08. 2016, 11:11:29

Název: C++ - jak to lze udělat lépe?
Přispěvatel: 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.

Kód: [Vybrat]
/* 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
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: dword 23. 08. 2016, 11:18:23
sorry, řádek:
Kód: [Vybrat]
eluclient *_this = (eluclient *) obj;má být takhle:
Kód: [Vybrat]
client *_this = (client *) obj;
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: zboj 23. 08. 2016, 11:34:28
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.

Kód: [Vybrat]
/* 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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: dword 23. 08. 2016, 11:43:42
zboj: nijak jsi mi neporadil, a tvůj názor je subjektivní, pokud nemáš nic k věci, už sem prosím nepiš
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: gamer 23. 08. 2016, 12:08:45
Co třeba něco takového?
Kód: [Vybrat]
#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());
}
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: borekz 23. 08. 2016, 12:09:09
Máš nějaký důvod pro upřednostnění callbacku před virtuální metodou nebo lambda funkcí ?
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 12:22:26
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...
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: zboj 23. 08. 2016, 12:33:01
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íš.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: dword 23. 08. 2016, 12:38:41
gamer: díky, tohle jsem potřeboval

téma uzavřeno
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Inkvizitor 23. 08. 2016, 13:05:59
téma uzavřeno

Fakt?
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: dword 23. 08. 2016, 13:43:23
téma uzavřeno

Fakt?

Samozřejmě mluvím pouze za sebe, a ano, opravdu! Dostal jsem, pro co jsem tu přišel.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: D3ad 23. 08. 2016, 14:54:21
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 14:58:45
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
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: D3ad 23. 08. 2016, 15:31:47
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?
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: cppman 23. 08. 2016, 15:38:57
Citace
co si myslis o letosni sklizni mrkve?

Dword je taková lopata, že by se s ním dala sklízet mrkev. 8)
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 15:47:59
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: D3ad 23. 08. 2016, 15:58:05
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: dword 23. 08. 2016, 15:58:33
Citace: Tuxik
(Ne)zaujatý pozorovatel potom vidí 100 debilů a myslí si o programátorech svoje.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 16:10:48
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 16:28:27
Citace: Tuxik
(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í.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: D3ad 23. 08. 2016, 16:49:06
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 16:55:37
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
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: D3ad 23. 08. 2016, 17:09:11
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: THC++ 23. 08. 2016, 17:30:31
Naprosto promrhaný prostor na balkóně. Papriky se nedají hulit.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: dword 23. 08. 2016, 17:37:45
Citace: Tuxik
(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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 20:31:10
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: javaman )( 23. 08. 2016, 21:08:51
Citace: Tuxik
(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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Tuxik 23. 08. 2016, 22:03:37
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.
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: Martin 24. 08. 2016, 00:10:13
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Í!!
Název: Re:C++ - jak to lze udělat lépe?
Přispěvatel: D3ad 24. 08. 2016, 10:41:11
Copak mrkev, ale JMELÍ!!

Nevim, na to mam Panoramixe, ale ten zrovna dela lektvary pro Asterixe a Obelixe.