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

C++ C a C++ C++ Tridy << nevim kde mam chybu (easy)

Avatar
honza.b4
Člen
Avatar
honza.b4:

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
Odpovídá na honza.b4
Lukáš Hruda (Luckin):

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 (Luckin)
honza.b4:

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
Odpovídá na honza.b4
Lukáš Hruda (Luckin):

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
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 11.12.2013 20:11
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Lukáš Hruda (Luckin):

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  +1 11.12.2013 20:33
Avatar
vitamin
Člen
Avatar
vitamin:

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
Odpovídá na vitamin
Lukáš Hruda (Luckin):

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 (Luckin)
vitamin:

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
Odpovídá na vitamin
Lukáš Hruda (Luckin):

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:

Vsem diky za odpovedi. 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. 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):

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
Odpovídá na honza.b4
Lukáš Hruda (Luckin):

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
Odpovídá na honza.b4
Lukáš Hruda (Luckin):

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.