Metoda volá metodu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Metoda volá metodu – C / C++ – Fórum – Programujte.comMetoda volá metodu – C / C++ – Fórum – Programujte.com

 

delicacyy0
Newbie
29. 8. 2012   #1
-
0
-

Zdravím,

pokročila jsem v chápání konstruktorů bez parametrů i s nimi, ale narazila jsem na problém, kdy nevím, jak metodou volat metodu. Abych to objasnila, měla jsem program modifikovat tak, aby konstruktor přijímal čtyři parametry
(což se povedlo, jede to). Při definici proměnné kružnice mám předat do konstruktoru vhodné hodnoty. (což si myslím, že je též ok) Dále mám implementovat ve třídě Circle metody readCentre(),readRadius() a readColor(), které od uživatele vyžádají příslušné hodnoty. Dále implementujte metodu readValues(), která postupně zavolá tři výše zmíněné metody. Tuto metodu mám použít v programu pro načtení dat od uživatele.

#include <iostream>
#include <g2.h>
#include <g2_X11.h>
using namespace std;

class Circle
{
  public:          
    Circle(int ax, int ay, int r, int c);
    void setCentre(int ax, int ay);
    void setRadius(int r);
    void setColor(int c);
    void printValues() const;
    void draw();
  private:        
    int x, y;
    int radius;
    int color;
   
};

Circle::Circle(int ax, int ay, int r, int c)
{
    x=ax;
    y=ay;
    radius=r;
    color=r;
}

void Circle::setCentre(int ax, int ay)
{
    x=ax;
    y=ay;
}

void Circle::setRadius(int r)
{
    radius=r;
}

void Circle::setColor(int c)
{
    color=c;
}

void Circle::printValues() const
{
    cout<<"Souradnice: "<<x<<", "<<y<<endl;
    cout<<"Polomer: "<<radius<<endl;
    cout<<"Barva: "<<color<<endl;
}

void Circle::draw()
{
    int dev = 0;
    dev = g2_open_X11(600, 600);  // Otevreni okna
    g2_set_line_width(dev, 5);    // Tloustka cary bude 5 pixelu
    g2_pen(dev, color);
    g2_circle(dev, x, y, radius);
}

int main()
{
    int x, y, r, c;
    Circle circ(x, y, r, c);

    cout<<"Zadejte souradnice stredu: ";
    cin>>x>>y;
    circ.setCentre(x,y);
    cout<<"Zadejte polomer: ";
    cin>>r;
    circ.setRadius(r);
    cout<<"Zadejte barvu: ";
    cin>>c;
    circ.setColor(c);
    circ.printValues();
    circ.draw();
    cin.get();
    cin.get();
    return 0;
}

Zkoušela jsem zpatlat to, že by metoda readValues() zavolala ty ostatní read metody a pak předala hodnoty v main funkci dál, ale jsem ztracená v tom, jak ten zápis má vypadat.. přemýšlela jsem i nad dalším konstruktorem, ale přijde mi to jako blbost.. za jakoukoli radu budu moc ráda..

Nahlásit jako SPAM
IP: 78.45.255.–
vitamin+8
Grafoman
29. 8. 2012   #2
-
0
-

Stačí kód z mainu vložiť do metód:

#include <iostream>
//#include <g2.h>
//#include <g2_X11.h>
using namespace std;

class Circle
{
  public:          
    Circle(int ax, int ay, int r, int c);
    void setCentre(int ax, int ay);
    void setRadius(int r);
    void setColor(int c);
    void printValues() const;
    void draw();
    
    void readCentre(){
		int x, y;
		cout<<"Zadejte souradnice stredu: ";
		cin>>x>>y;
		this->setCentre(x,y);
	}
    void readRadius(){
		int r;
		cout<<"Zadejte polomer: ";
		cin>>r;
		this->setRadius(r);
	}	
    void readColor(){
		int c;
		cout<<"Zadejte barvu: ";
		cin>>c;
		setColor(c);  //this->   mozes vynechat

	}
  private:        
    int x, y;
    int radius;
    int color;
   
};

Circle::Circle(int ax, int ay, int r, int c)
{
    x=ax;
    y=ay;
    radius=r;
    color=r;
}

void Circle::setCentre(int ax, int ay)
{
    x=ax;
    y=ay;
}

void Circle::setRadius(int r)
{
    radius=r;
}

void Circle::setColor(int c)
{
    color=c;
}

void Circle::printValues() const
{
    cout<<"Souradnice: "<<x<<", "<<y<<endl;
    cout<<"Polomer: "<<radius<<endl;
    cout<<"Barva: "<<color<<endl;
}

void Circle::draw()
{
    /*int dev = 0;
    dev = g2_open_X11(600, 600);  // Otevreni okna
    g2_set_line_width(dev, 5);    // Tloustka cary bude 5 pixelu
    g2_pen(dev, color);
    g2_circle(dev, x, y, radius);*/
}

int main()
{
    int x, y, r, c;
    Circle circ(x, y, r, c);	//cpp.cpp:84:27: warning: ‘x’, 'y', 'r', 'c' are used uninitialized in this function [-Wuninitialized]

    
    circ.readCentre();
    circ.readRadius();
    circ.readColor();
    
    circ.printValues();
    circ.draw();
    cin.get();
    cin.get();
    return 0;
}

pointer this ukazuje na objekt v ktorom sa "nachádzaš" (this môžeš vynechať, kompilátor ho za teba doplní).

Funkciu readValues() snáď už zvládneš.

ps: prečítaj si ten warning.

edit: Samozrejme tie funkcie readXXX() môžu nastaviť atribúty triedy priamo a nemusia použiť metódy, ale aspoň vidíš ako volať metódu vo vnútri inej metódy a že lokálne premenné môžu mať rovnaké mená ako atribúty triedy.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
delicacyy0
Newbie
29. 8. 2012   #3
-
0
-

#2 vitamin
tak do třídy se mohou cpát i {//nejake prikazy}.?...tak to jsem myslela, že není možné..

jsem lama, ani ty funkci už nenapíšu, dělala jsem to podle toho, co mám v materiálech od učitele a stejně to nejde..  

#include <iostream>
#include <g2.h>
#include <g2_X11.h>
using namespace std;

class Circle
{
  public:          
    Circle(int ax, int ay, int r, int c);
    void setCentre(int ax, int ay);
    void setRadius(int r);
    void setColor(int c);
    void printValues() const;
    void draw();
    void readValues();
     
      
    void readCentre()
     {
      int x, y;
      cout<<"Zadejte souradnice stredu: ";
      cin>>x>>y;
      this->setCentre(x,y);
     }
    void readRadius()
    {
     int r;
     cout<<"Zadejte polomer: ";
     cin>>r;
     this->setRadius(r);
     }	
    void readColor()
     {
      int c;
      cout<<"Zadejte barvu: ";
      cin>>c;
      setColor(c);
     }
    
  private:        
    int x, y;
    int radius;
    int color;
   
};

Circle::Circle(int ax, int ay, int r, int c)
{
    x=ax;
    y=ay;
    radius=r;
    color=r;
}

void Circle::setCentre(int ax, int ay)
{
    x=ax;
    y=ay;
}

void Circle::setRadius(int r)
{
    radius=r;
}

void Circle::setColor(int c)
{
    color=c;
}

void Circle::printValues() const
{
    cout<<"Souradnice: "<<x<<", "<<y<<endl;
    cout<<"Polomer: "<<radius<<endl;
    cout<<"Barva: "<<color<<endl;
}

void Circle::draw()
{
    int dev = 0;
    dev = g2_open_X11(600, 600);  // Otevreni okna
    g2_set_line_width(dev, 5);    // Tloustka cary bude 5 pixelu
    g2_pen(dev, color);
    g2_circle(dev, x, y, radius);
}

void readValues(Circle circ)
{
  cout << "Stred kruznice: " << circ.readCentre() << endl; 
  cout << "Polomer kruznice: " << circ.readRadius() << endl; 
  cout << "Barva kruznice: " << circ.readColor() << endl; 
}

int main()
{
    int x, y, r, c;
    Circle circ(x, y, r, c);

    circ.readCentre();
    circ.readRadius();
    circ.readColor();
    circ.readValues(circ);

    circ.printValues();
    circ.draw();
    cin.get();
    cin.get();
    return 0;
}
Nahlásit jako SPAM
IP: 78.45.255.–
vitamin+8
Grafoman
29. 8. 2012   #4
-
0
-

V tomto prípade je jedno kde  definujes funkciu, nasledujúce metódy sú totožné (až na implicitný inline flag, ale to ťa nemusí zaujímať):

class A{
	void fnc(){
		//telo funkcie
	}
};

//alebo:

class A{
	void fnc();
};

void A::fnc(){
	//telo funkcie
}

V metódach triedy môžeš volať hociakú inú metódu tej istej triedy ako keby to bola globálna funkcia (alebo cez ukazateľ this).

edit:

Metódy readXXX() majú návratový typ void a ten sa nedá vypísať cez cout :)

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
oplis10
Newbie
30. 8. 2012   #5
-
0
-

#3 delicacyy
No, máš tam pár blbostí

- konstruktor má 4 parametry, to je OK, ale na začátku definuješ 4 hodnoty int které neinicializuješ (májí náhodné hodnoty) a ty pak přiřazuješ proměnným - není splněna podmínka ze zadání "Při definici proměnné kružnice mám předat do konstruktoru vhodné hodnoty"

- Pracuješ vždy s tím jedním objektem, proto metodě readValues nemusíš předávat parametr na jiný objekt, viz. "void readValues(Circle circ)"

- Metoda readValues patří třídě Circle, proto při definici metody musíš použít tvat "void Circle::readValues() {...}

- V té metodě readValues se mají jen zadat hodnoty, resp. zadat hodnoty, proto nevím, proč se je tam snažís v cout vypisovat. Navíc jak řekl vitamin, mají návratový typ void, proto ani nemají co vypisovat

Upravený kód:

circle.h

#include <iostream>
#ifndef _CIRCLE_H_
#define _CIRCLE_H_

using namespace std;

 class Circle
{
  public:
    Circle(int ax, int ay, int r, int c);
    void setCentre(int ax, int ay);
    void setRadius(int r);
    void setColor(int c);
    void printValues() const;
    void draw();
    void readValues();
    void readCentre()
     {
      int x, y;
      cout<<"Zadejte souradnice stredu: ";
      cin>>x>>y;
      this->setCentre(x,y);
     }

    void readRadius()
    {
     int r;
     cout<<"Zadejte polomer: ";
     cin>>r;
     this->setRadius(r);
 }
    void readColor()
     {
      int c;
      cout<<"Zadejte barvu: ";
      cin>>c;
      setColor(c);
     }

  private:
    int x, y;
    int radius;
    int color;
};

#endif
--------------------------------------------
circle.cpp

#include <iostream>
#include "circle.h"
#include <g2.h>
#include <g2_X11.h>

using namespace std;

Circle::Circle(int ax, int ay, int r, int c)
{
    x=ax;
    y=ay;
    radius=r;
    color=r;
}

void Circle::setCentre(int ax, int ay)
{
    x=ax;
    y=ay;
}

void Circle::setRadius(int r)
{
    radius=r;
}

void Circle::setColor(int c)
{
    color=c;
}

void Circle::printValues() const
{
    cout<<"Souradnice: "<<x<<", "<<y<<endl;
    cout<<"Polomer: "<<radius<<endl;
    cout<<"Barva: "<<color<<endl;
}

void Circle::draw()
{
    int dev = 0;
    dev = g2_open_X11(600, 600);  // Otevreni okna
    g2_set_line_width(dev, 5);    // Tloustka cary bude 5 pixelu
    g2_pen(dev, color);
    g2_circle(dev, x, y, radius);
}

void Circle::readValues()
{
  readCentre();
  readRadius();
  readColor();
}
---------------------------------------------
main.cpp

#include <iostream>
#include "circle.h"

using namespace std;

int main()
{
    Circle circ(5, 4, 7, 1);
    circ.readValues();
    circ.printValues();
    circ.draw();
    cin.get();
    cin.get();
    return 0;
}

Vidím, že ti nejsou moc jasné základy OOP.....chce to nějaký dobrý studijní materiál....velmi dobré je Mistrovství v C++. Pokud to myslíš s programováním vážně, asi by se vyplatilo investovat do kvalitní literatury

Nahlásit jako SPAM
IP: 213.71.21.–
delicacyy0
Newbie
30. 8. 2012   #6
-
0
-

#5 oplis1
Díky za kód i za objasnění. Víš, mě hrozně mate ten studijní materiál od vyučujícího, co máme k dispozici. On tam totiž takové věci vůbec neuvádí. Jsou to povětšinou jenom vzorové kódy napsané napůl, které nejsou dostatečně popsané, jak fungují. A pak to tak vypadá. Už jsem si půjčila včera od M.Viriuse knihu o C/C++ a ještě C++ od Stroustrupa, v pátek mi dorazí C++ za 21 dní. Snažila jsem se od začátku schroustat toho Viriuse, ale připadně mi, že mi to nic nedalo, spíš demotivovalo, nemůžu najít ty potřebné info, které potřebuju vědět.. a hlavně, aby to bylo řečeno laictějším jazykem, alespoň ty základní věci, .. vážně bych se C++ chtěla naučit, ale mám asi tak trochu jiné zpracování a přijímání informací než jak podává můj vyučující a autoři knih, po kterých jsem zatím sáhla..

A Ty jsi se učil z čeho vlastně?

Nahlásit jako SPAM
IP: 78.45.255.–
delicacyy0
Newbie
30. 8. 2012   #7
-
0
-

#4 vitamin
Díky, to se hodí vědět  simtě, z jaké knihy jsi se učil C++?

Nahlásit jako SPAM
IP: 78.45.255.–
oplis10
Newbie
30. 8. 2012   #8
-
0
-
Nahlásit jako SPAM
IP: 213.71.21.–
vitamin+8
Grafoman
30. 8. 2012   #9
-
0
-

#7 delicacyy
Ja som sa učil z Nauč se sám C a Nauč se sám C++ .

Ale bolo to už dávno, prišiel som do kníhkupectva a tieto knižky vyzerali zaujímavo. Tie knihy čo tu postujú ostatný nepoznám.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
yaqwsx+9
Posthunter
30. 8. 2012   #10
-
0
-

#7 delicacyy
Rozumíme C++

Nahlásit jako SPAM
IP: 85.160.33.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
ingiraxo+15
Grafoman
30. 8. 2012   #11
-
0
-

kniha žádná, styl - pokus omyl :) a když něco opravdu nejde, tak google, youtube, dokumentace apod. .. výhodu to má tu, že si všechno ozkoušíš a víš co jde a co ne.. a imho se takto dobře učí a budeš si to i pamatovat :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
crazy
~ Moderátor
+10
Grafoman
31. 8. 2012   #12
-
0
-

#10 yaqwsx
souhlasím s yaqwsx, "Rozumíme C++" je velice dobrá kniha, ale myslím, že už není dlouho k sehnání... od začátku se tam používají objektové konstrukce, které tě přímo "vhodí" do OOP, takže se to učíš tak nějak za běhu... v Mistrovství C++ je to zase všechno dost podrobně (jsou tam i věci, které nevyužiješ, ale na druhou stranu se je vyplatí vědět)...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
31. 8. 2012   #13
-
0
-

Učebnice jazyka C od Herouta, pomoc kamaráda při prvních krocích, pokusy a omyly při řešení konkrétních věcí a občas vypadat na fóru jako největší blbec na světě

hu

Nahlásit jako SPAM
IP: 195.178.67.–
vitamin+8
Grafoman
31. 8. 2012   #14
-
0
-

#13 hlucheucho
To si mal dobré, ja som sa učil c a c++ v dobe keď som nemal internet  

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
delicacyy0
Newbie
31. 8. 2012   #15
-
+1
-
Zajímavé

#13 hlucheucho
"...a občas vypadat na fóru jako největší blbec na světě"

..tak to já vypadám furt  ale líná huba, holé neštěstí.. zbytečně spamovat nechci...ale co víc se může stát než jen to, že mi buď reagující pomohou pochopit anebo mi sem zakážou vstup a já nic nepochopím..

Nahlásit jako SPAM
IP: 78.45.255.–
KIIV
~ Moderátor
+43
God of flame
31. 8. 2012   #16
-
+1
-
Zajímavé

#15 delicacyy
kdyz to clovek moc nedava, tak je na case sehnat si nejake doucovani :D ... jen to nesmi byt nekdo, kdo ti pri kazdem zaseku hned ukaze reseni - to pak odkejves "ano chapu" a za 5 minut udelas stejnou kravinu znova :D

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
31. 8. 2012   #17
-
0
-

#14 vitamin
zřejmě doba, kdy jsem věděl, že existuje nějaký Basic a Pascal.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
delicacyy0
Newbie
31. 8. 2012   #18
-
0
-

#16 KIIV
potřebuju hlavně ten slovní komentář, na konkrétním programu to chápu lépe.. , +ukázat mi zápisy, jak mají vypadat, pokud jsem je ještě nikdy neviděla..

Ty myslíš, že jsem vyloženě zralá na nějaké doučování? :D

Nahlásit jako SPAM
IP: 78.45.255.–
KIIV
~ Moderátor
+43
God of flame
31. 8. 2012   #19
-
0
-

na zacatku je to lepsi... nevim co bych ted umel, kdybych nemel programovani v pascalu na stredni ...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
delicacyy0
Newbie
31. 8. 2012   #20
-
0
-

#13 KIIV
já si místo toho programování dala latinu.. a teď mi to programování očividně chybí.. ale nechci to vzdát! přemýšlím, jak to udělat, abych do toho nemusela investovat hodně peněz, jelikož je nyní nemám..

Nahlásit jako SPAM
IP: 78.45.255.–
31. 8. 2012   #21
-
0
-

Na začátku jsem měl Basic na PMD85 ve Svazarmu, na střední taky Basic, jeden semestr na VŠ Pascal, pak dlouho nic (asi 13 let), Assembler na 8051 a nakonec C++ Builder na Windows a C na jednočipech.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
31. 8. 2012   #22
-
0
-

#20 delicacyy
Zkus požádat někoho ze spolužáků, který se tomu aspoň trochu věnuje. Pokud nepomůže, bude to chtít hodně vlastního úsilí, pokusů a omylů.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
delicacyy0
Newbie
31. 8. 2012   #23
-
0
-

#22 hlucheucho
já jsem asi jediná ze spolužáků, co se tomu věnuju  c++ mám totiž jako povinně volitelný předmět a mnoho spolužáků se mu snaží vyhnout tak, že si zvolí něco jiného zkrátka.. anebo pokud si to musí zvolit, tak se v tom totálně plácají a 50 programů dělají ve zkouškovém.. většinou to od někoho vymámí, ale nepochopí..

p.s.: to Tvoje 'hu' na konci příspěvků.. myslela jsem si, že na mě hučíš, že jsem tak nechápavá.. ale teď jsem to už pochopila..

Nahlásit jako SPAM
IP: 78.45.255.–
31. 8. 2012   #24
-
0
-

#23 delicacyy

ano, je to jako monogram  

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
31. 8. 2012   #25
-
0
-

#23 delicacyy
no pokud si aspon trochu pekna, tak se na tebe temer kazdej programator rad vrhne...

(a mimo to, ti mozna i pomuze s tim programovanim :))

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
delicacyy0
Newbie
31. 8. 2012   #26
-
0
-

#25 KIIV
no, raději bych volila pomoc jenom s tím programováním

Nahlásit jako SPAM
IP: 78.45.255.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 130 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý