Chyba v kódu C++

hu

Re:Chyba v kódu C++
« Odpověď #15 kdy: 20. 11. 2013, 09:40:53 »
gamer:
ale já v hlavičkovém souboru #include "stdafx.h" includuju
#include <iostream>
mohu tento příkaz vložit přímo do kódu a nic to nepomůže.

Ale trida ostream je definovana v namespace std, takze bud pouzij direktivu use namespace std;,  nebo rozlisuj operatorem :: (tedy std::ostream)


hu

Re:Chyba v kódu C++
« Odpověď #16 kdy: 20. 11. 2013, 09:41:48 »
gamer:
ale já v hlavičkovém souboru #include "stdafx.h" includuju
#include <iostream>
mohu tento příkaz vložit přímo do kódu a nic to nepomůže.

Ale trida ostream je definovana v namespace std, takze bud pouzij direktivu use namespace std;,  nebo rozlisuj operatorem :: (tedy std::ostream)
Pardon, samozrejme "using namespace std;"

gamer

Re:Chyba v kódu C++
« Odpověď #17 kdy: 20. 11. 2013, 09:44:09 »
hu: using namespace std není dobré používat a už vůbec ne v hlavičkovém souboru.
webhope: proč se vázat na windows, nainstaluj linux do virtuálu a hotovo.

webhope

Re:Chyba v kódu C++
« Odpověď #18 kdy: 20. 11. 2013, 10:39:11 »
Ok.
Kód: [Vybrat]
using namespace std;jsem použil ale na nesprávném místě. Kód mám převzatý z článku na builder.cz ale tohle tam napsané neměli.
Normálně používám třídu std, ale oni ji tam napsanou nemají, což je taky pěkně matoucí. No nic, odstranil jsem většinu chyb, ale
po includování hlavičky se třídou MyClass dostávám hlášku že MyClass m; nemá definovaný defaultní konstruktor.
Když ale spouštím tu věc v té podobě co jsem posílal včera v noci, tedy bez oddělení třídy do hlavičkového souboru, tak to žádnou chybu nepsalo.

webhope

Re:Chyba v kódu C++
« Odpověď #19 kdy: 20. 11. 2013, 10:39:56 »
gamer, linux? Fuj!


webhope

Re:Chyba v kódu C++
« Odpověď #20 kdy: 20. 11. 2013, 10:54:18 »
gamer: díky za dobrou radu. Už to "skoro" jede. Teď jde o to, že rozjíždím jiný kód který je založený na té předchozí třídě. Tak zas
musím pochopit co se ode mě chce.

Kód: [Vybrat]
int main(void)
{
   MyClass m;
   cout << "Cekam objekt" << endl;
   cin >> m;
   if (!cin)
   {
     cerr << "Objekt nenacten! " << endl;
   }
   else
   {
     ofstream f("data.txt");
     if (!f)
     {
       cerr << "Nelze otevrit data.txt" << endl;
       return -1;
     }
     f << "Objekt byl:" << endl << m;
     cout << "Objekt byl:" << endl << m;
   }
   getch();
   return 0;
}

Zkompilováno bez chyby, ale mám hlášku v konzole že objekt nebyl nalezen. Ale vytvořil jsem soubory data.txt i s textem uvnitř.

webhope

Re:Chyba v kódu C++
« Odpověď #21 kdy: 20. 11. 2013, 10:57:16 »
Tedy pardon, píše to, Objekt nenacten!.

Asi nemůže najít cestu k souboru nebo co. Jak zjistit jakou cestu se snaží otevřít? Neměl bych tam zadat celou cestu k souboru? Asi jo, ne?

webhope

Re:Chyba v kódu C++
« Odpověď #22 kdy: 20. 11. 2013, 11:02:57 »
Já totiž nevím jaký objekt se ode mě očekává. Očividně se nejedná o pokus načíst soubor, takže cestu bych zadávat neměl. Očekával bych že jakýkoliv řetězec zadám, tak bude uložen to objektu m.

webhope

Re:Chyba v kódu C++
« Odpověď #23 kdy: 20. 11. 2013, 11:55:59 »
Možná mi něco uniklo že jsem nepochopil co v tom článku po mě chtějí, co tam mám zadat.
http://www.builder.cz/rubriky/c/c--/pretezovani-operatoru-lt-lt-a-gt-gt-pro-datove-proudy-v-c--155741cz
Píše jen: "Opět změníme funkci main v předchozím příkladu:"
Dále už žádné další vysvětlení  :(

Můj kód je rozdělen na hlavičkový soubor:
Kód: [Vybrat]
#include "stdafx.h"

class MyClass
{
private:
      int A,B;
   public:
  int getA() { return A; }
      int getB() { return B; }
      void setA(int a) { A = a; }
      void setB(int b) {B = b; }
  friend std::ostream& operator << (std::ostream &os, MyClass &objekt);
  friend std::istream& operator >> (std::istream &is, MyClass &objekt);
};

std::istream& operator >> (std::istream &is, MyClass &objekt)
{
   int cislo;
   is >> cislo; // Využiji již přetížených operátorů pro primitivní datové typy
   objekt.setA(cislo);
   is >> cislo;
   objekt.setB(cislo);
   return is; // Nezapomeňte na tuto drobnost! Jinak nebudete moc dávat operátory za sebe
}

std::ostream& operator << (std::ostream &os, MyClass &objekt)
{
   return (os << objekt.A << objekt.B); // Krátké, že?
}

a soubor cpp:
Kód: [Vybrat]
#include "stdafx.h"
#include "MyClass.h"

using namespace std; // using istream and ostream

int main(void)
{
   MyClass m;
   cout << "Cekam objekt" << endl; 
   cin >> m;
   if (!cin)
   {
     cerr << "Objekt nenacten! " << endl;
   }
   else
   {
     ofstream f("data.txt");
     if (!f)
     {
       cerr << "Nelze otevrit data.txt" << endl;
       return -1;
     }
     f << "Objekt byl:" << endl << m;
     cout << "Objekt byl:" << endl << m;
   }
   getch();
   return 0;
}

Tážu se tedy, chápete někdo co po mě chtějí?

Za druhé, pomohli byste to upravit tak, abych mohl funkci
Kód: [Vybrat]
friend std::istream& operator >> (std::istream &is, MyClass &objekt);využívat podobně jako
Kód: [Vybrat]
friend std::ostream& operator << (std::ostream &os, MyClass &objekt); tedy abych mohl nejdříve zadat název souboru, poté nějaké data, pak se to uloží a dále se to načte a vypíše co jsem tam napsal.
V prvním příkladu se řešil jen výstup pomocí jednoho řádku:
Kód: [Vybrat]
cout << "Adresa objektu je:" << endl << m;pro který existovala třída
Kód: [Vybrat]
ostream& operator << (ostream &os, MyClass &objekt)
{ friend ostream& operator << (ostream &os, MyClass &objekt); }
Chtěl bych tedy vyzkoušet toto elegantní řešení i pro vstup. Vešlo by se to na jeden řádek,
když bych chtěl zadat nejdříve jméno souboru, a po potvrzení ještě zadat data pro vstup?
Případně naopak, nejdříve zadat data pro soubor, a pak ho pojmenovat?
Myslím, ale že by to na jeden řádek nešlo, protože by to vlastně byly dvě různé funkce.
Tak nejdříve zadat to jméno a pak to pomoci přetypovaného operátoru uložit do souboru?

Bob

Re:Chyba v kódu C++
« Odpověď #24 kdy: 20. 11. 2013, 12:35:34 »
gamer, linux? Fuj!

Myslim, ze jsi si timto vyrokem na serveru o linuxu sam uzavrel toto vlakno :-)

webhope

Re:Chyba v kódu C++
« Odpověď #25 kdy: 20. 11. 2013, 12:41:15 »
Vážně? Že by tu byli tak silní pokrytci? Nemám nic proti linuxu, ale snad mohu říct svůj názor! Linux je dobrý, sám ho používám, ale ne na běžnou práci a programování! A jestliže používám Windows, tak ať mi nikdo nepodstrkuje linux, protože vím jak dlouho v něm všechno trvá a jak dlouho trvá se tyhle věci učit. Já už si vybral. Jestli mě kvůli tomu někdo odsuzuje, tak jeho problém. Jestli se někdo urazí kvůli tomu, že jsem vyjádřil svůj názor! Tohle vlákno nemá nic společného s linuxem, je to programování pod Windows!

nohope nohope

Re:Chyba v kódu C++
« Odpověď #26 kdy: 20. 11. 2013, 13:10:12 »
Proč se zabýváš přetěžováním operátorů a třídami, když ti evidentně chybí základy. Takhle ten kapitalismus nevybuduješ. Nejdřív se nauč pořádně základy a pak se teprve posuň k pokročilým tématům.

死神

  • ***
  • 159
    • Zobrazit profil
Re:Chyba v kódu C++
« Odpověď #27 kdy: 20. 11. 2013, 13:13:51 »
Tohle vlákno nemá nic společného s linuxem, je to programování pod Windows!

Nevidím tam žádný windows kód, tak nepřeháněj. A jak psal nohope, zkus to od začátku, nejdřív úplné základy, které ti evidentně chybí.

Re:Chyba v kódu C++
« Odpověď #28 kdy: 20. 11. 2013, 13:21:23 »
Tohle vlákno nemá nic společného s linuxem, je to programování pod Windows!

Nevidím tam žádný windows kód, tak nepřeháněj. ...

 ;D ach jo, už toho radši nechte došly mi ubrousky na monitor

Sten

Re:Chyba v kódu C++
« Odpověď #29 kdy: 20. 11. 2013, 13:30:51 »
Možná mi něco uniklo že jsem nepochopil co v tom článku po mě chtějí, co tam mám zadat.
http://www.builder.cz/rubriky/c/c--/pretezovani-operatoru-lt-lt-a-gt-gt-pro-datove-proudy-v-c--155741cz
Píše jen: "Opět změníme funkci main v předchozím příkladu:"
Dále už žádné další vysvětlení  :(

To vysvětlení je před tou větou (ofstream je děděný z ostream, a tak bude operátor << pro ten objekt fungovat úplně stejně pro ofstream jako funguje pro cout) a za tou větou je rovnou ta změněná funkce main uvedena.

Za druhé, pomohli byste to upravit tak, abych mohl funkci
Kód: [Vybrat]
friend std::istream& operator >> (std::istream &is, MyClass &objekt);využívat podobně jako
Kód: [Vybrat]
friend std::ostream& operator << (std::ostream &os, MyClass &objekt); tedy abych mohl nejdříve zadat název souboru, poté nějaké data, pak se to uloží a dále se to načte a vypíše co jsem tam napsal.
V prvním příkladu se řešil jen výstup pomocí jednoho řádku:
Kód: [Vybrat]
cout << "Adresa objektu je:" << endl << m;pro který existovala třída
Kód: [Vybrat]
ostream& operator << (ostream &os, MyClass &objekt)
{ friend ostream& operator << (ostream &os, MyClass &objekt); }
Chtěl bych tedy vyzkoušet toto elegantní řešení i pro vstup. Vešlo by se to na jeden řádek,
když bych chtěl zadat nejdříve jméno souboru, a po potvrzení ještě zadat data pro vstup?
Případně naopak, nejdříve zadat data pro soubor, a pak ho pojmenovat?
Myslím, ale že by to na jeden řádek nešlo, protože by to vlastně byly dvě různé funkce.
Tak nejdříve zadat to jméno a pak to pomoci přetypovaného operátoru uložit do souboru?

Moc ten dotaz nechápu, ale zkusím odpovědět: Žádné jméno souboru se tam nezadává, ten operátor pouze dostane nějaký výstupní proud, do kterého může zapisovat. Neví, co to je za proud, a ani to vědět nepotřebuje. On to nemusí být soubor, může to být cout, ostringstream, sítový socket, sdílená paměť nebo třeba kompresní filtr či jen černá díra.