Přiřazení objektu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Přiřazení objektu – C / C++ – Fórum – Programujte.comPřiřazení objektu – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
vollf820
Stálý člen
20. 8. 2007   #1
-
0
-

Zdravím lidi, jdu si pro další radu. Nedaří se mi přetížit operátor přiřazení. Zkoušel jsem to jako členskou funkci tak i jako friend. Nevím proč ale zkrátka to nefunguje. Kód zasílám níže.

BankAccount * baps[3];  // pole 4 objektů

baps[0] = new Overdraft(name, acctNum, balance); // vytvoření / přetypování objektu na objekt jiné třídy (že by problém?).


Moje verze přetížení 1:
BankAccount & BankAccount::operator=(BankAccount & ba)

{
if(this == &ba)
return *this;
else
strcpy(fullName, ba.fullName);
acctNum = ba.acctNum;
balance = ba.balance;
return *this;
}


Tohle je jako členská funkce a nadává to, že to nemá přístup k položkám té druhé třídy (což je pochopitelné).

Přetížení č. 2:
BankAccount & operator=(BankAccount & ba, Overdraft & ov)

{
if(&ov == &ba)
return ba;
else
strcpy(ba.fullName, ov.fullName);
ba.acctNum = ov.acctNum;
ba.balance = ov.balance;
return ba;
}


Tohle je verze se spřátelenou funkcí. Ale stejně nejde, píše to: 18 C:\DATA\C++\mistrovstvi43a.h `BankAccount& operator=(BankAccount&, Overdraft&)' must be a nonstatic member function

nevim co tim myslí ten kompilátor :/ Díky za rady. Ještě jsem to myslím zkoušel přetypovat při tom přiřazení pomocí konstruktoru, ale to mi myslím taky nešlo.

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
sn3d0
Věrný člen
20. 8. 2007   #2
-
0
-

No operator = pretazis v ramci danej triedy tymto sposobom:



class BankAccount {
...
bool operator=(Overdraft& ov) {
...
return true;
}

//alebo pre teba vhodnejsie bude
bool operator=(Overdraft* ov) {
...
return true;
}


...
};



Dolezite vsak je ze ty vo svojom kode pracujes z pointerami, takze je potrebne ich dereferencovat.Taktiez tvoj kod v preklade je trosku haluska lebo mas inicializovane pole ukazovatelov na 3 instancie objektu BankAccount, lenze tie niesu vytvorene. Cize ukazuje sa niekde nahodne do pamate co nieje velmi mudre. Kod by potom mal vyzerat bud takto:



BankAccount baps[3]; // pole 4 objektů
baps[0] = new Overdraft(name, acctNum, balance);


alebo takto:



BankAccount* baps[3]; // pole 4 objektů
baps[0] = new BankAccount();
*baps[0] = new Overdraft(name, acctNum, balance);


Inac podla mna ani jeden ani druhy sposob nieje vlemi rozumny lebo ti ostane vysiet v pameti instancia na Overdraft. Neviem o co sa to teda presne pokusas ale osobne si myslim ze je to nejaky zvlastny sposob akoby spojene pretazenie operatorov a polymorfizmus :-/ Alebo nejaky JAVA sposob kedy sa vsetko alokuje na heape.Osobne by som tu dal prednost Stacku a Overdraft umiestnil tam. Cize by to mohlo vyzerat nasledovne:



BankAccount baps[3]; // pole 4 objektů
Overdraft ov(name, acctNum, balance);
baps[0] = ov;

Nahlásit jako SPAM
IP: ...–
shutdown -h now
vollf820
Stálý člen
20. 8. 2007   #3
-
0
-

Díky za snahu ... zkusím to. No já se ten kód snažil co nejvíc zkrátit a tak to asi vypadá jako blbost. Hážu to sem teda celý ať víš o co jde.

BTW: Je to opsaný z knihy Mistrovství v C++ nedělal sem to já. Jen je tam úkol předělat hlavní a odvozenou třídu tak, aby sem udělal virtuální třídu a pak obě ty třídy odvodil z ní. Tak se o to pokouším ale hlásí mi to chybu na řádku s tím přiřazením (vytučnil sem ho).

#include <iostream>

using namespace std;
#include "mistrovstvi43a.h"
#include "mistrovstvi43b.h"
const int SIZE = 3;
const int MAX = 35;
inline void EatLine() { while (cin.get() != '\n') continue; }

int main()
{
BankAccount pokus;
Overdraft pokus2;


BankAccount * baps[SIZE];
char name[MAX];
long acctNum;
double balance;
int acctType;
int i;
for (i = 0; i < SIZE; i++)
{
cout << "Zadejte jmeno klienta: ";
cin.get(name, MAX);
EatLine();
cout << "Zadejte cislo uctu klienta: ";
cin >> acctNum;
cout << "Zadejte pocatecni zustatek klienta: ";
cin >> balance;
cout << "Chcete-li Brass Account, zadejte 1, chcete-li Brass Plus"
<< "Account, zadejte 2: ";
cin >> acctType;
EatLine();
if (acctType == 2)
baps[i] = new Overdraft(name, acctNum, balance);
else
{
baps[i] = new BankAccount(name, acctNum, balance);
if (acctType != 1)
cout << "Interpretovano jako 1.\n";
}
}
for (i= 0; i< SIZE; i++)
{
baps[i]->ViewAcct();
cout << endl;
}
cout << "Nashledanou!\n";

system("PAUSE");
return 0;
}


Tak mě napadá ... když už to sem teda hážu celý, jestli mi to nechceš zkontrolovat a doporučit lepší řešení, protože fakt nevim jetsli tak jak sem to udělal je to to pravý ořechový.

Virtuální třída:
#ifndef _BANK_H_

#define _BANK_H_

class Bank
{
private:
enum { MAX = 35 };
char fullName[MAX];
long acctNum;

public:
Bank(const char *s = "Nullbody", long an = 0);
virtual double Balance() const = 0;
void ViewAcct() const;
};

#endif
************ DEFINICE FUNKCÍ *****************

#include <iostream>
using namespace std;
#include "mistrovstvi43c.h"

Bank::Bank(const char *s , long an)
{
strcpy(fullName, s);
acctNum = an;
}

void Bank::ViewAcct() const
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
cout << "Klient: " << fullName << endl;
cout << "Cislo uctu: " << acctNum << endl;
cout.setf(initialState);
}


Odvozená třída 1:
#ifndef _BANKACCT_H_

#define _BANKACCT_H_

#include "mistrovstvi43c.h"
#include "mistrovstvi43b.h"

class BankAccount : public Bank
{
private:
double balance;
public:
BankAccount(const char * nam = "Nullbody", long act=0, double bal = 0.0);

void Deposit(double amt);
void Withdraw(double amt);
void ViewAcct() const;
double Balance() const;

};

#endif
********* DEFINICE ČL. FUNKCÍ **********

#include<iostream>
using namespace std;
#include "mistrovstvi43a.h"
#include <cstring>

BankAccount::BankAccount(const char * nam, long act, double bal) : Bank(nam, act)
{
balance = bal;
}

void BankAccount::Deposit(double amt)
{
balance += amt;
}





void BankAccount::Withdraw(double amt)
{
if (amt<=balance)
balance -= amt;
else
cout << "Pozadovana castka $" << amt
<< "prevysuje zustatek.\n"
<< "Vyber stornovan.\n";
}

void BankAccount::ViewAcct() const
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
Bank::ViewAcct();
cout << "Zustatek: $" << balance << endl<<endl;
cout.setf(initialState);
}

double BankAccount::Balance() const
{
return balance;
}



Třída č. 2:
#ifndef _OVERDRF_H_

#define _OVERDRF_H_

#include "mistrovstvi43c.h"

class Overdraft : public Bank

{
private:
double balance;
double maxLoan;
double rate;
double owesBank;
public:
Overdraft(const char * s = "Nullbody", long an = -1, double bal = 0.0, double ml = 500,
double r = 0.10);
Overdraft(const Bank & ba, double ml = 500, double r = 0.1);
void ViewAcct() const;
void Withdraw(double amt);
void ResetMax(double m) { maxLoan = m; }
void ResetRate(double r) { rate = r; }
void ResetOwes() { owesBank = 0; }
void Deposit(double amt);
double Balance() const;
friend Overdraft & operator=(Overdraft & ov, BankAccount & ba);
};
#endif
****** DEFINICE ČL. FUNKCÍ ******
#include<iostream>
using namespace std;
#include "mistrovstvi43b.h"

Overdraft::Overdraft(const char *s, long an, double bal,
double ml, double r) : Bank(s, an)

{
balance = bal;
maxLoan = ml;
owesBank = 0.0;
rate = r;
}

Overdraft::Overdraft(const Bank & ba, double ml, double r) : Bank(ba)
{
maxLoan = ml;
owesBank = 0.0;
rate = r;
}

void Overdraft::ViewAcct() const
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
Bank::ViewAcct();
cout << "Maximalni vyse pujcky: $" << maxLoan << endl;
cout << "Dluzna castka: $" << owesBank <<endl;
cout << "Zustatek: $" << balance <<endl<<endl;
cout.setf(initialState);
}

void Overdraft::Withdraw(double amt)
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
double bal = Balance();

if (amt <= bal + maxLoan - owesBank)
{
double advance = amt - bal;
owesBank += advance * (1.0 + rate);
cout << "Bankovni pujcka: $" << advance << endl;
cout << "Financni poplatek: $" << advance * rate << endl;
Deposit(advance);

}
else
cout<<"Kreditni limit prekrocen. Transakce stornovana.\n";
cout.setf(initialState);
}

void Overdraft::Deposit(double amt)
{
balance += amt;
}

double Overdraft::Balance() const
{
return balance;
}

Overdraft & operator=(Overdraft & ov, BankAccount & ba)
{
if(&ov == &ba)
return ba;
else
strcpy(ov.fullName, ba.fullName);
ov.acctNum = ba.acctNum;
ov.balance = ba.balance;
return ov;
}

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
20. 8. 2007   #4
-
0
-

No ako tka na to pozeram tak ide o priklad na virtualne fcie a polymorfizmus. Cize mas rodicovsku triedu Bank. Ta by mala mat 2 virtualne fcie virtual Balance() a ViewAcct(). Dalej mas 2 odvodene triedy BankAccount a Overdraft ktore by mali mat implementovane tieto virtualne fcie a vykonavat ich kod po svojom. Takze ty v tom main()-e nebudes mat pole baps typu BankAccount ale typu Bank pretoze to je spolocna trieda od ktorej su dedene. Cize by to malo vyzerat nasledovne



...
Bank* baps[4];
...
if (acctType == 1) {
baps[i] = new BankAccount(...);
...
} else {
baps[i] = new Overdraft(name, acctNum, balance);
...
}


Cize nakoniec ked sa dostanes do toho loopu na koniec:


for (i= 0; i< SIZE; i++) {
baps[i]->ViewAcct();
cout << endl;
}


tak sa bude volat prislusna funkcia ViewAcct(). Cize ak baps[0] bude vlastne ukazovatel na instanciu BankAccount-u tak sa zavola BankAccount::ViewAcct(), naopak ked baps[0] bude ukazovatel na instanciu Overdraft-u tak sa zavola Overdraft::ViewAccount.

Nahlásit jako SPAM
IP: ...–
shutdown -h now
sn3d0
Věrný člen
20. 8. 2007   #5
-
0
-

Inac mne sa osvedcil jeden priklad na vysvetlenie toho co virtualne funkcie su.Ide o priklad na zvieratkach.Zoberme si ze mame farmu zvieratok.Su tam rozne druhy.Napriklad:

-Lev je cicavec a je z celade mackovitych
-Korela je vtak z celade papagajovitych
-Andulka je vtak z celade papagajovitych
-Orol skalny je zase vtak z celade sokolovitych

Vsetky maju spolocne to ze su to zvieratka, zakladnou triedou bude teda Zvieratko. Nasu farmu bude reprezentovat pole zvieratok.O kazdom budeme teda chciet zistit co je to za zvieratko.Cize vsetky budu mat funkciu kto_som().Tato funkcia bude virtualna, cize kazde zvieratko bude vykonavat to svoje-vypise to svoje. Zakladna trieda teda bude vyzerat nasledovne:



class Zvieratko
{
public:
virtual void kto_som() {
cout << "Zvieratko::kto_som() napisal: som nezname zviera" << endl;
}
};


V nasom priklade si vsimnime ze korela, andulka a orol su druhu vtak, aby to teda bolo spolocne tak vytvorime triedy 2ch druhov odvodenych od nasej triedy Zvieratko:



class Cicavec : public Zvieratko
{
public:
virtual void kto_som() {
cout << "Cicavec::kto_som() napisal: som cicavec" << endl;
}
};

class Vtak : public Zvieratko
{
public:
virtual void kto_som() {
cout << "Vtak::kto_som() napisal: som vtak" << endl;
}
};



Dalsia uroven su celade:



class Mackovita : public Cicavec
{
public:
virtual void kto_som() {
Cicavec::kto_som();
cout << "Mackovite::kto_som() napisal: som z celade mackovitych" << endl;
}
};


class Papagajovita : public Vtak
{
public:
virtual void kto_som() {
Vtak::kto_som();
cout << "Papagajovita::kto_som() napisal: som z celade papagajovitych" << endl;
}
};


class Sokolovita : public Vtak
{
public:
virtual void kto_som() {
Vtak::kto_som();
cout << "Sokolovita::kto_som() napisal: som z celade sokolovitych" << endl;
}
};





Nakoniec su samotne zvieratka:



class Lev : public Mackovita
{
public:
virtual void kto_som() {
cout << "Lev::kto_som() napisal: som Lev" << endl;
Mackovita::kto_som();
}
}


class Korela : public Papagajovita
{
public:
virtual void kto_som() {
cout << "Korela::kto_som() napisal: som Korela" << endl;
Papagajovita::kto_som();
}
}


class Andulka : public Papagajovita
{
public:
virtual void kto_som() {
cout << "Andulka::kto_som() napisal: som Andulka" << endl;
Papagajovita::kto_som();
}
}


class Orol : public Sokolovita
{
public:
virtual void kto_som() {
cout << "Orol::kto_som() napisal: som Orol" << endl;
Sokolovita::kto_som();
}
}



No cize mame potrebne triedy reprezentujuce zvieratka. Ako to funguje? Majme teda pole reprezentujuce nasu farmu v ktorej budeme mat 6 zvieratok.



int main()
{
Zvieratko* farma_zvieratiek[8];

//naplnime nasu farmu roznymi zvieratkami
farma_zvieratiek[0] = new Orol(); //prakticky Orol je dedeny od Sokolovitych, tie su dedene od Vtakov a tie su dedene od Zvieratko, cize v podstate je to zvieratko atd..
farma_zvieratiek[1] = new Andulka();
farma_zvieratiek[2] = new Lev();
farma_zvieratiek[3] = new Andulka();
farma_zvieratiek[4] = new Korela();
farma_zvieratiek[5] = new Orol();
farma_zvieratiek[6] = new Cicavec();
farma_zvieratiek[7] = new Zvieratko();


//teraz nechame zobrazit obsah nasej farmy
for (int i = 0; i < 8; i++) {
cout << "----------------------------" << endl;
farma_zvieratiek[i]->kto_som();
}

//nakoniec vsetky zvieratka uvolnime
for (int i = 0; i < 8; i++) {
delete farma_zvieratiek[i];
}
return 0;
}


Ked to cele spustis, mal by si dostat nasledujuci vypis:



-bash-3.00$ ./a.out
----------------------------
Orol::kto_som() napisal: som Orol
Vtak::kto_som() napisal: som vtak
Sokolovita::kto_som() napisal: som z celade sokolovitych
----------------------------
Andulka::kto_som() napisal: som Andulka
Vtak::kto_som() napisal: som vtak
Papagajovita::kto_som() napisal: som z celade papagajovitych
----------------------------
Lev::kto_som() napisal: som Lev
Cicavec::kto_som() napisal: som cicavec
Mackovite::kto_som() napisal: som z celade mackovitych
----------------------------
Andulka::kto_som() napisal: som Andulka
Vtak::kto_som() napisal: som vtak
Papagajovita::kto_som() napisal: som z celade papagajovitych
----------------------------
Korela::kto_som() napisal: som Korela
Vtak::kto_som() napisal: som vtak
Papagajovita::kto_som() napisal: som z celade papagajovitych
----------------------------
Orol::kto_som() napisal: som Orol
Vtak::kto_som() napisal: som vtak
Sokolovita::kto_som() napisal: som z celade sokolovitych
----------------------------
Cicavec::kto_som() napisal: som cicavec
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera


Cize ako to funguje? V nasej farme mame zvieratka. Slucka zacne vypisovat co su to konkretne za zvieratka.Pretoze funkcia kto_som je virtualna, chova sa to trosku inac. Totizto zoberie sa prve zvieratko. KEdze je to virtualna funkcia najde sa najvyzsia implementacia tejto funkcie, v tomto pripade kedze
farma_zvieratiek[0] je Orol tak Orol::kto_som(). Ta vypise ze je to Orol a zavola sa nizsia funkcia Sokolovita::kto_som(). V tejto funkcii zase je prve vtak::kto_som, cize sa skoci do nej a vykona sa. Ak si vsimnes Vtak::kto_som uz dalej nevola Zvieratko::kto_som cize tam sa to skonci.

Trosku ina situacia je pri farma_zvieratiek[6] a farma_zvieratiek[7]. Totizto pri prechadzani sa zisti ze farma_zvieratiek[6] je Cicavec, cize sa zavola Cicavec::kto_som(). U farma_zvieratiek[7] je zase ta situacia ze je to len cisto zvieratko. Cize sa zavola Zvieratko::kto_som(). Ta zavola teda zvieratko::kto_som() a ta len vypise ze je to nezname zvieratko. Ak by funkcia kto_som nebola virtualna, vykona sa len Zvieratko::kto_som(). Mozes si to vyskusat tak ze odstanis virtual vsade kde sa vyskytuje. Vysledok by mal byt nasledujuci:



-bash-3.00$ ./a.out
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera
----------------------------
Zvieratko::kto_som() napisal: som nezname zviera


Este jedna vec. Totizto ak by si mal len cisto farmu vtakov, tak budes mat pole Vtak* farma_vtakov[SIZE]. Tu vsak nemozes urobit to ze:


...
Vtak* farma_vtakov[6];
...
farma_vtakov[0] = new Lev();


Preco? Pretoze Lev nieje dedeny od Vtakov.

Snad je to zrozumitelne podane. Snazil som sa spravit kod co najjednoduchsie takze chybaju take veci ako virtualne destruktory atd.. Inac vysledny kod by mal vyzerat nasledovne:


Nakoniec sem davam kompletny kod ktory sa da v pohode skompilovat:
zvieratka.cpp


#include <iostream>

using namespace std;

class Zvieratko
{
public:
virtual void kto_som() {
cout << "Zvieratko::kto_som() napisal: som nezname zviera" << endl;
}
};


class Cicavec : public Zvieratko
{
public:
virtual void kto_som() {
cout << "Cicavec::kto_som() napisal: som cicavec" << endl;
}
};

class Vtak : public Zvieratko
{
public:
virtual void kto_som() {
cout << "Vtak::kto_som() napisal: som vtak" << endl;
}
};


class Mackovita : public Cicavec
{
public:
virtual void kto_som() {
Cicavec::kto_som();
cout << "Mackovite::kto_som() napisal: som z celade mackovitych" << endl;
}
};


class Papagajovita : public Vtak
{
public:
virtual void kto_som() {
Vtak::kto_som();
cout << "Papagajovita::kto_som() napisal: som z celade papagajovitych" << endl;
}
};


class Sokolovita : public Vtak
{
public:
virtual void kto_som() {
Vtak::kto_som();
cout << "Sokolovita::kto_som() napisal: som z celade sokolovitych" << endl;
}
};


class Lev : public Mackovita
{
public:
virtual void kto_som() {
cout << "Lev::kto_som() napisal: som Lev" << endl;
Mackovita::kto_som();
}
};


class Korela : public Papagajovita
{
public:
virtual void kto_som() {
cout << "Korela::kto_som() napisal: som Korela" << endl;
Papagajovita::kto_som();
}
};


class Andulka : public Papagajovita
{
public:
virtual void kto_som() {
cout << "Andulka::kto_som() napisal: som Andulka" << endl;
Papagajovita::kto_som();
}
};


class Orol : public Sokolovita
{
public:
virtual void kto_som() {
cout << "Orol::kto_som() napisal: som Orol" << endl;
Sokolovita::kto_som();
}
};


int main()
{
Zvieratko* farma_zvieratiek[8];

//naplnime nasu farmu roznymi zvieratkami
farma_zvieratiek[0] = new Orol(); //prakticky Orol je dedeny od Sokolovitych, tie su dedene od Vtakov a tie su dedene od Zvieratko, cize v podstate je to zvieratko atd..
farma_zvieratiek[1] = new Andulka();
farma_zvieratiek[2] = new Lev();
farma_zvieratiek[3] = new Andulka();
farma_zvieratiek[4] = new Korela();
farma_zvieratiek[5] = new Orol();
farma_zvieratiek[6] = new Cicavec();
farma_zvieratiek[7] = new Zvieratko();


//teraz nechame zobrazit obsah nasej farmy
for (int i = 0; i < 8; i++) {
cout << "----------------------------" << endl;
farma_zvieratiek[i]->kto_som();
}

//nakoniec vsetky zvieratka uvolnime
for (int i = 0; i < 8; i++) {
delete farma_zvieratiek[i];
}
return 0;
}


Heh snad som tu nenapisal nejaku volovinu a je to pochopitelne.

Nahlásit jako SPAM
IP: ...–
shutdown -h now
vollf820
Stálý člen
20. 8. 2007   #6
-
0
-

Díky, je to čupr ... smekám před tvou ochotou věnovat mi tolik času :))

Jinak chyba byla v tom že tam měl bejt baps[i] = new Bank jak si psal. Vůbec mě nenapadlo to modifikovat, a ted když si to napsal a koukám na to tak je to přece táááááák logický ... Blbá chyba, jednoduchá, ale vrtal sem se v tom přes hodinu a nenašel to ... Další poučení do budoucna.

Ještě jednou díky ...

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
20. 8. 2007   #7
-
0
-

V pohode.. Testovania v robote som uz mal plne zuby, nudna robota, vonku sa pekne zamracilo a dazd klopkal na sklo.. bola to prijemna zmena pisat niekomu dlhorozsiahle vysvetlenie :)

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 153 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý