Diskuze: C++ Tridy << nevim kde mam chybu (easy)
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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();
Diky za odpoved.
Kdyz tam dopisu ty zavorky, tak cin hazi chybu:
Error: no operator ">>" matches these operands; operand type are: std::istream >> int
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);
Těsně vedle, asi se na mně začíná podepisovat fakt, že jsem v C++ už
pár týdnu nedělal
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;
}
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.
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.
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;
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;
};
Vyskúšaj namiesto int, typ long long.
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.
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.
Zobrazeno 14 zpráv z 14.