Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
ahoj, učím se C++ a narazil jsem na problém se kterým si nevím rady, v následujícím programu jsem si vytvořil jednoduchou třídu Obdelnik, když chci použít šířku a výšku k vykreslení obdelníku na obrazovku tak ni to hodí chybu: error: argument of type 'int (Obdelnik::)()' does not match 'int'
co to znamená? int je int ať je kde chce ne?
#include <iostream>
using namespace std;
//třída obdelníku
class Obdelnik {
private:
int sirka;
int vyska;
public:
int vratVysku(void) const;
int vratSirku(void) const;
void nastavStrany(int a, int b);
};
//implementace funkcí třídy
void Obdelnik::nastavStrany(int a, int b) {
if((a < 1 || a > 15) || (b < 1 || b > 15))
cout << "Chyba, strany nesmi byt mensi nez 1 nebo vetsi nez 15" << endl;
else {
sirka = a;
vyska = b;
}
}
int Obdelnik::vratSirku(void) const {
return sirka;
}
int Obdelnik::vratVysku(void) const {
return vyska;
}
//menu programu
void nabidka(void) {
cout << "|~~~~~ Nabidka ~~~~~|" << endl;
cout << "Vykreslit obdelnik - 1" << endl;
cout << "Zmenit velikost - 2" << endl;
cout << "Konec - 3" << endl;
cout << endl;
}
//vykreslení obrazce
void vykresli(int a, int b) {
int i, j;
for(i = 0; i < a; i++) {
for(j = 0; j < b; j++) {
cout << "*";
}
cout << endl;
}
}
int main() {
bool ukoncitProgram = false;
int vstup, a, b;
Obdelnik obdl;
obdl.nastavStrany(4, 4);
while(ukoncitProgram != true) {
nabidka();
cin >> vstup;
switch(vstup) {
case 1:
vykresli(obdl.vratVysku, obdl.vratSirku);
cout << endl;
break;
case 2:
cout << "Zadej stranu a: ";
cin >> a;
cout << "Zadej stranu b: ";
cin >> b;
cout << endl;
obdl.nastavStrany(a, b);
break;
case 3:
ukoncitProgram = true;
break;
default:
cout << "Neznamy operator." << endl;
cout << endl;
}
}
return 0;
}Offline
Zdravím,
int vratVysku(void) const a int vratSirku(void) const jsou metody (vlastnosti), zapomněl si tedy u tohoto řádku závorky:
vykresli(obdl.vratVysku(), obdl.vratSirku());
Vyřešeno?
Offline
↑ RePRO:
jééé, až tak triviální?? to jsem si vůbec neuvědomil :D
Offline
Jinak jestli mohu (trošku) poradit, tak bych ze zvyku změnil dvě věci:
1) nastavení stran rovnou do konstruktoru
2) metodu vykresli bychom mohli použít rovnou do třídy Obdelnik (ve skutečnosti se tyhle věci ještě řeší abstraktní třídou Obrazec). Metoda vykresli teda nebude mít parametry a využijeme tedy zapouzdření (jeden z rysů OOP).
Offline
Tady jenom ukazuji řešení, kde je ještě nadtřída Obrazec, která uchovává datové položky: ID, pozice x, pozice y někde ve 2D prostoru. Dává se to do třídy Obrazec, jelikož tyto položky budou pro všechny objekty stejné.
Rozdílné se naopak budou jevit implementace obsahů a obvodů, které musíme implementovat v daných třídách konkrétního objektu.
Ukázka, jak by to mohlo asi vypadat.
soubor Obrazec.h
#include <iostream>
using namespace std;
class Obrazec {
protected:
int x, y, id;
int static pocet;
public:
Obrazec(int x, int y) {
this->id = ++pocet;
this->x = x;
this->y = y;
};
virtual void vypis (){
cout << "id: " << id << " x: " << x << " y: " << y << endl;
};
virtual int obsah() = 0;
virtual int obvod() = 0;
int getId() {
return id;
};
};
int Obrazec::pocet = 0;
class Obdelnik : public Obrazec {
private:
int a, b;
public:
Obdelnik(int a, int b, int x, int y) : Obrazec(x,y) {
this->a = a;
this->b = b;
}
virtual int obsah() {
return a*b;
}
virtual int obvod() {
return 2*(a+b);
}
virtual void vypis () {
Obrazec::vypis();
cout << "a: " << a << " b: " << b << " Obvod: " << obvod() << " Obsah: " << obsah() << endl;
}
};
class Kruh : public Obrazec {
private:
int r;
public:
Kruh(int r, int x, int y) : Obrazec(x,y) {
this->r=r;
}
virtual int obsah() {
return 3*r*r;
}
virtual int obvod() {
return 2*3*r;
}
virtual void vypis () {
Obrazec::vypis();
cout << "r: " << r << " Obvod: " << obvod() << " Obsah: " << obsah() << endl;
}
};
class Sestiuhelnik: public Obrazec {
private:
int r, s;
public:
Sestiuhelnik(int r, int s, int x, int y) : Obrazec(x,y){
this->r = r;
this->s = s;
}
virtual int obsah() {
return (s*(r*r))/2;
}
virtual int obvod() {
return 6*s;
}
virtual void vypis () {
Obrazec::vypis();
cout << "r: " << r << "strana: " << s << " Obvod: " << obvod() << " Obsah: " << obsah() << endl;
}
};soubor main.cpp
#include "Obrazec.h"
int main() {
Obdelnik o1(1,1,3,4);
Obdelnik o2(3,2,8,4);
Kruh k1(1,3,4);
Kruh k2(2,8,4);
Sestiuhelnik s1(2,3,2,4);
o1.vypis();
o2.vypis();
k1.vypis();
k2.vypis();
s1.vypis();
system("PAUSE");
return EXIT_SUCCESS;
}Offline
↑ RePRO:
díky, každá rada se hodí, když člověk začíná, tvůj kód prostuduji
ještě jednou díky
Offline
Stránky: 1