#8 Kit
Uz chapu, super, diky!
Příspěvky odeslané z IP adresy 212.79.110.–
Dava vam nejaky smysl tahle podminka?
if ((file != null) && (!file.exists() || !file.isFile()))
Podle me to moc smysl nedava. Pouzil bych:
if (!file.exists() || !file.isFile())
Ahoj,
trápím se s tím, jak přetransformovat funkci dole do klasického skriptu v Bashi.
String[] pole = abcd.split("-|\\.xml");
Za jakékoliv rady budu velice rád!
No ono tak jak to teď mám to už funguje. Tzn. mám něco jako
Shromazdovani shr;
Zpracovavani zp(shr);
zp.zpracujData(true, data.data());
zp.zpracujData(true, data.data());
zp.zpracujData(true, data.data());
zp.zpracujData(true, data.data());
zp.zpracujData(false, data.data());
čímž to testuju. Furt ale dumám nad tím zápisem
Zpracovavani(Shromazdovani & shr) : shromazdovac{shr} {;}
To je standardní C++ zápis? Nikde ve článcích o C++ konstruktorech jsem to nenašel. A bylo by možné tento řádek zapsat až v tom bloku? Myšleno
Trida::Trida(){
//...
}
Aha a jak by to mělo být správně dle OOP?
Myslel jsem
Zpracovavani zp(&shr);
#22 KIIV
To chápu, děkuju. Jen mě zajímalo, zda mám správnou myšlenku. Prakticky mám problém s tím, že v inicializaci třídy Zpracovavani provádím v třídě např. ABCD. Je jasné, že
Zpracovavani zp();
teď použít nemohu, protože konstruktor má vstupní parametr. Jsem uplně mimo když bych to chtěl vyřešit něčím jako:
// uvnitr tridy ABCD
Shromazdovani & shr;
Zpracovavani zp(&);
Ahoj,
tak jsem se s tím zkoušel poprat, ale zatím bez úspěchu. Ještě jednou shrnu, o co mi jde. Mám dvě třídy Zpracovavani{} a Shromazdovani{}:
#ifndef ZPRACOVAVANI_H
#define ZPRACOVAVANI_H
#include <QByteArray>
class Zpracovavani
{
public:
Zpracovavani();
void zpracujData(bool ukladani, QByteArray data);
};
#endif // ZPRACOVAVANI_H
#include "Zpracovavani.h"
void Zpracovavani::zpracujData(bool ukladani, QByteArray data){
if (ukladani == true){
// ulozData(data.data())
}else{
//ukazData()
}
}
#ifndef SHROMAZDOVANI_H
#define SHROMAZDOVANI_H
#include <QByteArray>
class Shromazdovani
{
public:
Shromazdovani();
void ulozData(QByteArray data);
QByteArray ukazData();
private:
QByteArray shromazdovac;
};
#endif // SHROMAZDOVANI_H
#include "Shromazdovani.h"
Shromazdovani::Shromazdovani()
{
}
void Shromazdovani::ulozData(QByteArray data){
shromazdovac.append(data);
}
QByteArray Shromazdovani::ukazData(){
QByteArray pomShromazdovac = shromazdovac.data();
return pomShromazdovac;
}
Problém je v tom, že metoda zpracujData() je zvenčí v cyklu volána a já potřebuju data ze vstupního parametru metody ukládat do shromažďovače ve třídě Shromazdovani.
Chápu tedy správně, že správná cesta je udělat něco takového?
#ifndef ZPRACOVAVANI_H
#define ZPRACOVAVANI_H
#include <QByteArray>
#include "Shromazdovani.h"
class Zpracovavani
{
public:
Zpracovavani(Shromazdovani & shr) : shromazdovac{shr} {;}
void zpracujData(bool ukladani, QByteArray data);
private:
Shromazdovani & shromazdovac;
};
#endif // ZPRACOVAVANI_H
#10 KIIV
Shromazdovac bych rád používal ve více třídách (ale ne současně). Myšleno, že za běhu programu se bude moct využívat např. jen třída A. Při spuštění programu s jinou konfigurací prozměnu jen třída X atd.
Mohl bych poprosit o vysvětlení téhle řádky?
A(B & b): shromazdovac{b} {;}
#5 Kit
Pak ale úplně nechápu to injektování do konstruktoru. Jak to bylo myšlené?
Jinak pokud to má být mimo třídu, udělal bych to takhle:
#include "Shromazdovac.h"
Shromazdovac sh;
tridaA::tridaA()
{
}
tridaA::zpracuj()
{
sh.ulozData(); // sh zde neexistuje, protoze init je v konstruktoru
}
Globální proměnnou to právě řešit nechci...
#3 Kit
Pokoušel jsem se to tak udělat, ale mám problém, že když chci vytvořit instanci třídy Shromažďovač v konstruktoru, v těle metody Zpracuj() už není viditelná. Nevím zda to popisuju srozumitelně - prostě pokud udělám např.:
tridaA::tridaA()
{
Shromazdovac sh;
}
tridaA::zpracuj()
{
sh.ulozData(); // sh zde neexistuje, protoze init je v konstruktoru
}
Ahoj,
mohl by mi někdo poradit s následujícím problémem?
Mám třídu A, uvnitř které je metoda Zpracuj(), která je během vykonávání programu několikrát zavolána. Do metody Zpracuj() bych chtěl přidat "shromažďovač", který by PO CELOU DOBU běhu programu shromažďoval určitá data. Tzn. v těle metody Zpracuj() by byla metoda ulozData() a např. i ukazData().
No a teď ten problém. Implementaci onoho shromažďovače bych chtěl mít v třídě B. Pokud bych uvnitř metody Zpracuj provedl inicializaci a pak buffer používal. Např.:
B shromazdovac;
shromazdovac.ulozData();
Bylo by mi to úplně k ničemu, protože při druhém zavolání metody Zpracuj() by se mi vytvořila nová instance a o data uložená ve shromařďovači bych přišel.
Nevěděli byste, jak tuto situaci řešit (jedná se o C++)?
#16 BDS
Použil jsem ten tvůj kód a výpis mi funguje stejně. V té třídě Eviduj, resp. Eviduj2 se mi ale hodnota proměnné stále drží na false.
//varianta 2:
static class Eviduj2
{
public:
static bool metodaKdeChciZjistitHodnotuPromenne(Zpracuj * instanceZpracuj)
{
return instanceZpracuj->getStavNeceho();
}
};
S tím, že tu metodu kde chci zjistit hodnotu proměnné zavolám takhle:
void Eviduj::Abcdef()
{
Zpracuj *zp = new Zpracuj();
bool b = Eviduj::metodaKdeChciZjistitHodnotuPromenne(zp);
// vypis b = false
}
#14 BDS
No přímo v souboru Zpracuj.cpp mám tuto metodu:
void Zpracuj::set()
{
Zpracuj *zp = new Zpracuj();
zp->setStavNeceho(true);
}
Celou tu metodu set() pak volám z mainu jako
Zpracuj::set();
A v tom hlavičkovém Zpracuj.h je ta metoda deklarována takto:
public:
static void set();
Jo ještě teda upřesnění, nemám to takhle: "zp.setStav", ale tak: zp->setStav (nechtělo se to jinak zkompilovat)
#9 BDS
Ten setter jsem nastavil na public (pozn.: proč je to nutné, když ho využívám pouze ve třídě Zpracuj a nikde jinde?) a furt je to stejné. Ještě je otázka, jestli ho správně volám. Uvnitř třídy Zpracuj ho v metodě např. abcd() zavolám takto:
Zpracuj zp;
zp.setStavNeceho(true);
#7 BDS
Super, moc děkuju za pomoc!
Použil jsem variantu č. 2, protože právě potřebuji, aby šlo ve všech instancích o stejnou proměnnou (aspoň se domnívám).
Pokud teď měním hodnotu proměnné stavNeceho, která je v konstruktoru, opravdu dostávám správné výsledky.
Ještě jsem ale narazil na jeden problém. Co když teď budu chtít hodnotu stavNeceho settrem setStavNeceho() ve třídě Zpracuj změnit? Pokud se o to pokusím "nestatickým" způsobem, hodnota se nezmění a statickým způsobem to zase nejde zkompilovat, protože void setStavNeceho(bool stavNeceho_) ... nemá modifikátor "static". Jak to lze nejlépe řešit?
Myšleno - když změním z.setStavNeceho(false) na z.setStavNeceho(true); Prostě si to za všech okolností drží false.
#2 BDS
Takže musím vytvořit instanci třídy Zpracuj, aby se zavolal konstruktor. Ale pokud místo:
bool stavNecehoZeTridyZpracuj = Eviduj::instanceZpracuj->getStavNeceho();
Použiju:
Zpracuj* z = new Zpracuj();
bool stavNecehoZeTridyZpracuj = z->getStavNeceho();
Program zase spadne. Nebo jsem to špatně pochopil (prosím o trpělivost, jsem začátečník)?
#16 BDS
Radši jsem to pospal celé od znova zde: http://programujte.com/…-jine-tridy/
Ahoj, pomohl by mi někdo s následujícím problémem?
Mám dvě třídy Zpracuj a Eviduj. Ve třídě Zpracuj je funkce provedNastaveni() která má za úkol pomocí settru nastavit hodnotu proměnné setStavNeceho na false. Pokud by však funkce provedNastaveni nebyla (například z mainu) zavolána, stavNeceho by měl zůstat na true – prostě default hodnota (řeším konstruktorem).
Já ale potřebuji s proměnnou stavNeceho pracovat i ve třídě Eviduj. Ovšem pouze tak, že mě zajímá její hodnota – nechci ji měnit. Snažím se tedy uvnitř třídy Eviduj použít getter.
Bohužel při provádění řádku níže, program spadne. Nevíte, kde by mohla být chyba?
bool stavNecehoZeTridyZpracuj = Eviduj::instanceZpracuj->getStavNeceho();
Kód vypadá takto:
Zpracuj.cpp
#include "Zpracuj.h"
Zpracuj::Zpracuj()
{
// Chci aby kdyz se nezavola setter, byla default hodnota true
stavNeceho = true;
}
Zpracuj::~Zpracuj()
{
}
// zavolano napr. z mainu (za urcitych podminek)
void Zpracuj::provedNastaveni()
{
Zpracuj z;
z.setStavNeceho(false);
}
Zpracuj.h
#ifndef ZPRACUJ_H
#define ZPRACUJ_H
class Zpracuj
{
public:
static Zpracuj *inst;
public:
Zpracuj();
virtual ~Zpracuj();
bool getStavNeceho()
{
return stavNeceho;
}
static Zpracuj *getInstance()
{
if(!inst) inst = new Zpracuj();
return inst;
}
static void provedNastaveni();
public:
bool stavNeceho;
private:
void setStavNeceho(bool stavNeceho_) {stavNeceho = stavNeceho_;}
};
#endif // ZPRACUJ_H
Eviduj.cpp
Zpracuj* Eviduj::instanceZpracuj = NULL;
Eviduj::Eviduj()
{
}
Eviduj::metodaKdeChciZjistitHodnotuPromenne()
{
// pri debugovani to zde selze
bool stavNecehoZeTridyZpracuj = Eviduj::instanceZpracuj->getStavNeceho();
Eviduj.h
#ifndef EVIDUJ_H
#define EVIDUJ_H
#include "Zpracuj.h"
class Eviduj
{
public:
Eviduj();
private:
static Zpracuj *instanceZpracuj;
};
#endif // EVIDUJ_H
Děkuji za objasnění, tuším, kam tím míříte. Problém, který ale mám je spíše čistě o OOP, resp. OOP v C++. Architektura aplikace je už nějakým způsobem navržena a já jediné, co chci, je vypropagovat proměnnou z jedné třídy do druhé tak, abych nemusel používat procedurální extern.
Budu tedy konkrétní - mám třídy Zpracuj() a Eviduj(). Cílem je, abych mohl proměnnou ze třídy Zpracuj() předat do třídy Eviduj(). Mám (nefunkční) řešení, které vypadá takto:
Zpracuj.h
#ifndef ZPRACUJ_H
#define ZPRACUJ_H
class Zpracuj
{
public:
static Zpracuj *inst;
public:
Zpracuj();
virtual ~Zpracuj();
bool getStavNeceho()
{
return stavNeceho;
}
static Zpracuj *getInstance()
{
if(!inst) inst = new Zpracuj();
return inst;
}
static void provedNastaveni();
public:
bool stavNeceho;
private:
void setStavNeceho(bool stavNeceho_) {stavNeceho = stavNeceho_;}
};
#endif // ZPRACUJ_H
Zpracuj.cpp
#include "Zpracuj.h"
Zpracuj::Zpracuj()
{
// Chci aby kdyz se nezavola setter, byla default hodnota true
stavNeceho = true;
}
Zpracuj::~Zpracuj()
{
}
// zavolano napr. z mainu (za urcitych podminek)
void Zpracuj::provedNastaveni()
{
Zpracuj z;
z.setStavNeceho(false);
}
Eviduj.h
#ifndef EVIDUJ_H
#define EVIDUJ_H
#include "Zpracuj.h"
class Eviduj
{
public:
Eviduj();
private:
static Zpracuj *instanceZpracuj;
};
#endif // EVIDUJ_H
Eviduj.cpp
Zpracuj* Eviduj::instanceZpracuj = NULL;
Eviduj::Eviduj()
{
}
Eviduj::metodaKdeChciZjistitHodnotuPromenne()
{
// pri debugovani to zde selze
bool stavNecehoZeTridyZpracuj = Eviduj::instanceZpracuj->getStavNeceho();
}
#8 Kit
Třída A se jmenuje např. EvidenceJablek a slouží ke zpracování dat ze vstupního souboru. Vzniknou mi pak proměnné typu zraleJablko, puvodJablka, ... No a ve třídě StanovCenu pak potřebuju udělat jednoduchou IF podmínku, kde např. bude if (puvodJablka == CR){...}.
Takže pokud uvažujeme situaci výše, jak bych měl správně "zjistit" v té třídě StanovCenu hodnotu proměnné puvodJablka?
#4 Kit
Takže pokud to chápu správně, měl bych třídu A:
A.cpp
A::A()
{
}
A::~A()
{
}
void A::priradHodnoty()
{
A instanceOfA;
instanceOfA.setZraleJablko(true);
}
A.h
#ifndef A_H
#define A_H
class A
{
public:
A();
virtual ~A();
bool getZraleJablko() {return zraleJablko;}
void setZraleJablko(bool zj) {zraleJablko= ZJ;}
private:
bool zraleJablko;
private:
static void priradHodnoty();
};
#endif // A_H
A ve třídě B bych pak mohl libovolně, po vytvoření instance třídy, používat getZralejablko? Je tento návrh cca správně?
#2 Kit
No v podstatě se jedná o třídu A, která slouží k vytáhnutí dat ze souboru a zpracování, resp. přiřazení hodnot k proměnným. Tzn. pokud je v souboru někde definováno, že počet jablek je 10, do proměnné pocetJablek se zapíše hodnota 10.
Třída B pak na základě této proměnné provede nějakou akci.
Tou sloužbou mám chápat jakože zavolání getPocetJablek()?
Ahoj.
Mohl by mi tu někdo poradit jak jednoduše v C++ předat proměnnou z jedné třídy do druhé? Použil jsem k tomu extern, ale předpokládám, že to není "čisté" řešení. Druhý nápad je použít getter a setter, ale přiznám se, že v C++ přesně nevím jak na to. Moc děkuju za pomoc!
Měl bych stejný dotaz na toto téma. Jak "zjednosušit" kód níže - jedná se o v podstatě totožný princip jako v úvodu?
Třída XYZ, kde se v nějaké metodě volá metoda start():
if (Tools::getScale(scale, &timeA, factor) == 1)
Processing::start();
else
Processing::start();
Třída Tools, kde je implementace metody getScale():
int Tools::getScale(int scale, int *timeA, int factor)
{
int timeS = 0;
int timeB = Tools::getTime();
timeS = timeB - *timeA;
if (timeS > (scale * factor))
{
*timeA = timeB;
return 1;
}
else
{
return 2;
}
}
Lze to zapsat lépe?
Ahoj,
mohl by mi tu někdo pomoct s čistějším zápisem úseku kódu? Naimplementoval jsem zpoždovač, který má za úkol zpomalovat volání jedné metody. Funkčně vše funguje, ale kód mi přijde dost divně zapsaný. Proto se ptám - nešlo by to jinak? Samotná metoda zpoždovače:
bool zpozdovac(int nejaka_hodnota){
if (spoustec == true)
{
// uloz casovy rozdil
if (rozdilCasu > (nejaka_hodnota))
{
return true;
}
}
else
return false;
}
A metodu výše volám takto (a právě to volání stejné metody jak na true, tak na false mi přijde nevhodné):
if (zpozdovac == true)
// zavolej metodu ABCD()
else
// zavolej metodu ABCD()
V reálu mám zpoždovač implementovaný v separátní třídě, protože ho chci volat z více míst - proto poptřebuju, aby byl jako metoda.
Děkuji předem za návrhy na zlepšení.
Ahoj, rád bych si po dlouhé době zahrál jednu multiplayer hru, která pro svoji funkčnost potřebuje mít otevřené určité porty. Udělal jsem tedy následující: dočasně jsem vypnul Windows Firewall, ukončil antivirák (ESET Smart Security 6) a na routeru nastavil Port Range Forwarding přesně dle manuálu hry (tzn. např. port 80, 443, 1500-4999 atd.). IP adresu jsem samozřejmě nastavil na počítač za routerem, takže něco jako 192.168.1.130.
Hra se stále nemohla připojit na autentifikační server a tak jsem zkoumal dál. Přes příkaz netstat jsem zjistil, že mnou povolený porty ve výpisu uvedený nejsou... Zkoušel jsem i PFPoerCheckerem otestovat např. port 80, ale výstupem byla jen hláška, že port není otevřený. Nějaké nápady, kde by mohla být chyba? Děkuji
Zdravím!
Vytvářím takový projekt v Javě a narazil jsem na problém s parsováním řetězce, na který nemůžu vymyslet žádný (efektivní) postup :-( V podstatě se jedná o tohle:
Přijde mi číslo verze ve tomto formátu.
String vstup = "1.2.3";
A já potřebuju aby na výstupu bylo tohle.
int vystup = "1020300011";
Tzn. tečky zaměnit na 0 a na konec dát ty 0011.
Může ale nastat i situace, kdy přijde číslo verze v tomto formátu.
String vstup = "1.2.1358";
Tzn. na konci by bylo 4-ciferné číslo (jiná situace nastat nemůže). Pak by výstup měl vypdat takto.
int vystup = "1020135811";
Budu vděčný za Vaše rady!
Ahoj.
Mohl by mi tu někdo prosím vysvětlit jaký je rozdíl mezi těmito profesemi?
- Softwarový inženýr
- Vývojář
- Programátor
Budu končit školu a tak bych rád měl jasno co se pod tím názvem vlastně skrývá (abych věděl o jakou práci se vlastně ucházet :-)). Myslel jsem, že je všechno jedno a to samé, ale dozvěděl jsem se, že to tak není.