Chyba v kódu C++

webhope

Chyba v kódu C++
« kdy: 19. 11. 2013, 22:47:54 »
Můžete mi poradit, kde mám chybu?

#include <iostream>
http://paste.ofcode.org/33JicnqDi38ErmMEUsbGGfd

Dostávám nějak moc chyb:
s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(18): error C2061: syntax error : identifier 'myClass'
s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(19): error C2805: binary 'operator >>' has too few parameters
s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(22): error C2065: 'objekt' : undeclared identifier
s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(22): error C2228: left of '.getA' must have class/struct/union
          type is ''unknown-type''
s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(24): error C2065: 'objekt' : undeclared identifier
s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(24): error C2228: left of '.getB' must have class/struct/union

A je to podle tohoto článku:
http://www.builder.cz/rubriky/c/c--/pretezovani-operatoru-lt-lt-a-gt-gt-pro-datove-proudy-v-c--155741cz?diskuse


OleEinar

Re:Chyba v kódu C++
« Odpověď #1 kdy: 19. 11. 2013, 23:02:16 »
pre zaciatok myClass m; -----> MyClass m;

kozec

Re:Chyba v kódu C++
« Odpověď #2 kdy: 19. 11. 2013, 23:08:53 »
V tomto pripade bude najvacsou chybou pouzitie msvc :P GCC slusne upozorni, ze je myClass nedeklarovane.

Inak este volas MyClass.getA(cislo) s parametrom, zatial co deklaracia ziaden parameter necaka a tvoje "Krátké, že?" je sice kratke, ale nepripustne, ak A a B deklarujes privatne. getA() a getB() bude fungovat.

ondra.holub

Re:Chyba v kódu C++
« Odpověď #3 kdy: 19. 11. 2013, 23:12:37 »
Nejdříve je potřeba si ujasnit, jestli chceš, aby se tvá třída jmenovala myClass, nebo MyClass a pak všude používat jenom jedno označení.

V operatoru >> se volají metody objekt.getA(cislo), ale tam asi chceš setA(cislo).

V operatoru << musíš mezi čísla strčit nějaký bílý znak, jinak se ti ta dvě čísla spojí a nepůjdou načíst jako dvě hodnoty.

A pak už zbývá jenom doplnit nenadefinované metody.

webhope

Re:Chyba v kódu C++
« Odpověď #4 kdy: 19. 11. 2013, 23:20:54 »
Dík za rady, ano udělal jsem několik chyb během přepisu

Jaké metody, že tam nejsou nadefinované?
Teď nerozumím proč nejsou zpřístupnit soukromí členové.
Zatím ani nerozumím tomu co by to mělo (potřebuju to nejdříve rozjet, abych si to odkrokoval).

http://paste.ofcode.org/cHRADAPFjW8irsQFTB4kTm

s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(30): error C2248: 'MyClass::A' : cannot access private member declared in class 'MyClass'
          s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(10) : see declaration of 'MyClass::A'
          s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(8) : see declaration of 'MyClass'
s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(30): error C2248: 'MyClass::B' : cannot access private member declared in class 'MyClass'
          s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(10) : see declaration of 'MyClass::B'
          s:\temp\c++\operátory a datové proudy\01 (2) přetížení operátorů\01 (2) přetížení operátorů\01 (2) přetížení operátorů.cpp(8) : see declaration of 'MyClass'
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========


ondra.holub

Re:Chyba v kódu C++
« Odpověď #5 kdy: 19. 11. 2013, 23:30:53 »
Operátor máš definovaný jako globální funkci. Není to metoda třídy MyClass, takže nemůže přistupovat k jejím prvkům, které jsou private. Ale klidně může zavolat její public metody, tedy getA() a getB()

webhope

Re:Chyba v kódu C++
« Odpověď #6 kdy: 19. 11. 2013, 23:38:30 »
Takže chyba je tady:

Kód: [Vybrat]
ostream& operator << (ostream &os, MyClass &objekt)
{
   return (os << objekt.A << objekt.B); // Krátké, že?
}

Pokud k přístupu k soukromým proměným A a B. To bych chápal, kdyby operátor nebyl přetypovaný.
Ale měl bych ho mít přetypovaný. Jak si psal že mám dát mezery mezi čísla, jak si to myslel?
Já mám
operator >> (...)
Mezery jsem dal z obou stran.

webhope

Re:Chyba v kódu C++
« Odpověď #7 kdy: 19. 11. 2013, 23:51:05 »
Tak jsem to rozluštil (rozjel). http://paste.ofcode.org/36XAbMsFeHsSsyB9EtZshKM

webhope

Re:Chyba v kódu C++
« Odpověď #8 kdy: 20. 11. 2013, 08:42:27 »
Ještě ke kódu. Zajímalo by mě, jak to, že cout tiskne adresu místo text, který jsem zadal.
Tohle nemohu pochopit. Dále by mě ještě zajímalo jak se anglicky řekne přetížení operátorů nebo přetížit operátor.

vbl

Re:Chyba v kódu C++
« Odpověď #9 kdy: 20. 11. 2013, 08:52:39 »
Přetížení operátoru = operator overload.

webhope

Re:Chyba v kódu C++
« Odpověď #10 kdy: 20. 11. 2013, 09:03:42 »
Ještě jedna věc. Teď zkouším tu třídu přesunout do samostatného hlavičkového souboru a dostávám chybu:

Stdafx.h obsahuje
#include<fstream>
#include <iostream>
#include <conio.h>

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 ostream& operator << (ostream &os, MyClass &objekt);  
};

Chyba je v podstatě na řádku kde se objevuje slovo friend.

s:\temp\c++\operátory a datové proudy\02 ofstream_read_file\02 ofstream_read_file\myclass.h(12): error C2143: syntax error : missing ';' before '&'


Jde mi o to, že další článek navazuje a používá se tam opět třída MyClass, takže jsem to chtěl dát do samostatného souboru aby to bylo přehlednější.

gamer

Re:Chyba v kódu C++
« Odpověď #11 kdy: 20. 11. 2013, 09:23:27 »
S clangem by se ti začínalo líp, generuje rozumnější chybové hlášky:
Kód: [Vybrat]
clang++ main.cc
main.cc:13:14: error: unknown type name 'ostream'
      friend ostream& operator << (ostream &os, MyClass &objekt);     
             ^
Jinak std::ostream

webhope

Re:Chyba v kódu C++
« Odpověď #12 kdy: 20. 11. 2013, 09:27:56 »
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.

webhope

Re:Chyba v kódu C++
« Odpověď #13 kdy: 20. 11. 2013, 09:33:07 »
Ale fakt to vypadá jako by tam ta třída ostream nebyla načtená:

...
Kód: [Vybrat]
private
ostream hello;
...
...\myclass.h(7): error C2146: syntax error : missing ';' before identifier 'hello'

Používám Visual Studio Express. Ano, hlášky jsou nepřesné.

webhope

Re:Chyba v kódu C++
« Odpověď #14 kdy: 20. 11. 2013, 09:35:29 »
Znáš nějaký spolehlivý zdroj odkud stáhnout ten clang pro win32? Nechci si zavirovat počítač.