Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C++ Tridy << nevim kde mam chybu (easy)

Aktivity
Avatar
honza.b4
Člen
Avatar
honza.b4:11.12.2013 18:45

Zdravim. Je mi 14 let, ucim se programovat. Ted se snazim pochopit tridy v C++ a napsal sem jednoduchou aplikaci.. Bohuzel visual studio tam furt nekde vidi chybu..

Zdrojak:

hlavicka.h -- https://drive.google.com/…LWdQbTg/edit?…

main.cpp -- https://drive.google.com/…cTc3NUU/edit?…

chybovy log -- https://drive.google.com/…X2xjZjg/edit?…

Pomozte mi to opravit prosim

 
Odpovědět
11.12.2013 18:45
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na honza.b4
Lukáš Hruda:11.12.2013 19:03

Při volání členské funkce je potřeba za její název napsat závorky.

cin >> c.getX();
cin >> c.getY();
cin >> c.getRadius();
cin >> c.getColor();
c.printValues();
 
Nahoru Odpovědět
11.12.2013 19:03
Avatar
honza.b4
Člen
Avatar
Odpovídá na Lukáš Hruda
honza.b4:11.12.2013 19:15

Diky za odpoved.

Kdyz tam dopisu ty zavorky, tak cin hazi chybu:

Error: no operator ">>" matches these operands; operand type are: std::istream >> int
 
Nahoru Odpovědět
11.12.2013 19:15
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na honza.b4
Lukáš Hruda:11.12.2013 20:04

Jo, promiň, nějak mi to nedošlo, nemůžeš načítat do návratové hodnoty funkce. Leda že by ta funkce vracela referenci, což pokud jsi začátečník počítam nevíš co je. Musíš to načítat do nějaké proměnné a pak třeba nastavit hodnotu setterem.

int color;
cin << color;
c.setColor(color);
 
Nahoru Odpovědět
11.12.2013 20:04
Avatar
Odpovídá na Lukáš Hruda
Zdeněk Pavlátka:11.12.2013 20:11

cin >> color

Nahoru Odpovědět
11.12.2013 20:11
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Lukáš Hruda:11.12.2013 20:33

Těsně vedle, asi se na mně začíná podepisovat fakt, že jsem v C++ už pár týdnu nedělal :D

 
Nahoru Odpovědět
11.12.2013 20:33
Avatar
vitamin
Člen
Avatar
vitamin:11.12.2013 20:55

Jednoduhsie by to mohlo vyzerat takto:

#include <iostream>

struct Circle{
        int x = 0;
        int y = 0;
        int radius = 0;
        int color = 0;

        friend std::ostream& operator<<(std::ostream& out, const Circle& c){
                return out << "souradnice stredu: " << c.x << " " << c.y << std::endl
                        << "polomer: " << c.radius << " " << std::endl
                        << "cislo barvy: " << c.color << std::endl;
        }
};

int main(){
        using namespace std;

        Circle c;
        cout << "Zadejte prosim souradnici stredu X: ";
        cin >> c.x;
        cout << "\nZadejte prosim souradnici stredu Y: ";
        cin >> c.y;
        cout << "\nZadejte prosim polomer kruznice: ";
        cin >> c.radius;
        cout << "\nZadejte prosim barvu (1, 3, 7, 19 nebo 25) ";
        cin >> c.color;

        cout << c;
}
Editováno 11.12.2013 20:57
 
Nahoru Odpovědět
11.12.2013 20:55
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na vitamin
Lukáš Hruda:11.12.2013 21:51

Myslím, že pokud se snaží pochopit třídy a tím nejspíš i základy OOP, tak tohle nebude nejvhodnější způsob. Pochybuji, že se už dostal k přetěžování operátorů a friend funkcím.

 
Nahoru Odpovědět
11.12.2013 21:51
Avatar
vitamin
Člen
Avatar
Odpovídá na Lukáš Hruda
vitamin:11.12.2013 21:55

Ja som as nepochopil preco skoro vseci robia miesto vereinych atributov privatne + primityvne getery a setery... Kod sa potom zbitocne natahuje a s oop to nema nic spolocne.

 
Nahoru Odpovědět
11.12.2013 21:55
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na vitamin
Lukáš Hruda:11.12.2013 22:04

V tomhle případě je to zbytečné, ale všeobecně je možná lepší si zvyknout atributy zapouzdřovat i když v C++ to v podobných případech taky většinou nedělám. Já ale narážel hlavně na tohle:

friend std::ostream& operator<<(std::ostream& out, const Circle& c){
        return out << "souradnice stredu: " << c.x << " " << c.y << std::endl
                << "polomer: " << c.radius << " " << std::endl
                << "cislo barvy: " << c.color << std::endl;
 
Nahoru Odpovědět
11.12.2013 22:04
Avatar
honza.b4
Člen
Avatar
honza.b4:12.12.2013 12:50

Vsem diky za odpovedi. <i>Myslím, že pokud se snaží pochopit třídy a tím nejspíš i základy OOP, tak tohle nebude nejvhodnější způsob. Pochybuji, že se už dostal k přetěžování operátorů a friend funkcím.</i> Luckin ma pravdu. Tak daleko sem se jeste nedostal.

Svoji aplikaci sem nakonec predelal takhle, ale ty cisla se v konzoli zobrazuji spatne (u vystupu). Vzdy se zobrazi maximum te promenne int (-858993460):

main.cpp <<

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

void Circle::setCentre(int x, int y){
        this->x = x;
        this->y = y;
        cout << "Zadejte prosim X: " << endl;
        cin >> x;
        cout << "Zadejte prosim Y: " << endl;
        cin >> y;
}

void Circle::setColor(int c){
        this->color = c;
        cout << "Zadejte barvu v cislech: " << endl;
        cin >> c;
}
void Circle::setRadius(int r){
        this->radius = r;
        cout << "Zadejte prosim radius: " << endl;
        cin >> r;

}

void Circle::draw(){
        setCentre(x,y);
        setColor(color);
        setRadius(radius);
}
void Circle::printValues(){
        cout << "Souradnice stredu jsou: " << x << " " << y << endl;
        cout << "Polomer je: " << radius << endl;
        cout << "Barva je: " << color << endl;
}

int main(){
        Circle c;
        c.draw();
        c.printValues();
        system("PAUSE");
}

a hlavicka.h <<

#include <iostream>
using namespace std;


class Circle{
public:
        void setCentre(int x, int y);
        void setRadius(int r);
        void setColor(int c);
        void printValues();
        void draw();
private:
        int x, y, radius, color;
};
Editováno 12.12.2013 12:52
 
Nahoru Odpovědět
12.12.2013 12:50
Avatar
Libor Šimo (libcosenior):12.12.2013 13:17

Vyskúšaj namiesto int, typ long long.

Nahoru Odpovědět
12.12.2013 13:17
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na honza.b4
Lukáš Hruda:12.12.2013 19:51

To není maximum, je to nějaká hodnota která je prostě v tu chvíli na daném místě v paměti. Nikde ty proměnné totiž neinicializuješ. Musíš do nich po vytvoření nebo lépe při vytvoření přiřadit nějakou hodnotu. Doporučuju udělat to pomocí konstruktoru.

 
Nahoru Odpovědět
12.12.2013 19:51
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na honza.b4
Lukáš Hruda:12.12.2013 19:56

Teď jsem si všiml, že ty hodnoty načítáš v metodě setCentre, ale načítáš je špatně. Načítáš to do parametrů té metody a ne do atributů třídy. A proč vůbec ta metoda nějaké parametry přebírá, vždyť jsou tam uplně k ničemu a navíc do nich při volání dostazuješ to samé co se jimi pak snažíš nastavit.

 
Nahoru Odpovědět
12.12.2013 19:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.