Keresés

Új hozzászólás Aktív témák

  • cadtamas

    tag

    válasz dobragab #4199 üzenetére

    Köszönöm a kimerítő választ. Ígérem átolvasom még párszor mire rendesen megértem. :R

  • cadtamas

    tag

    Rectangle::Rectangle(int top, int left, int bottom, int right) //konstruktor, idáig rendben vagyunk
    {
    itsTop = top; //Ez elvileg az implementáció, amit nem taglal a könyv, hogy miért kell és később miért nem használjuk semmire.
    itsRight = right;
    itsLeft = left;
    itsBottom = bottom;

    itsUpperLeft.setX(left);
    itsUpperLeft.setY(top);

    itsUpperRight.setX(right);
    itsUpperRight.setY(top);

    itsLowerLeft.setX(left);
    itsLowerLeft.setY(bottom);

    itsLowerRight.setX(right);
    itsLowerRight.setY(bottom);
    }

    Ugye az implementáció azért kell, mert az alapján fog elkészülni a négyszög. Gyakorlatilag automatikusan lefutnak ezek az utasítások, amikor egy négyszög objektumot létrehozunk.
    Viszont az első 4 változó privát elérésű tag. Itt mégis lehet nekik közvetlenül értéket adni?
    Vagy ez ilyenkor nem számít? Vagy ez a négy változó nem is az a változó amit a .h fájlban deklaráltunk, hanem valami helyi dolog?

    Elnézést a hülye kérdésekért, de ha ezeket nem rakom tisztába, később tutira nem fogom érteni, hogy mi történik.

  • cadtamas

    tag

    válasz mgoogyi #4191 üzenetére

    Nagyon köszönöm a segítséged. Sokat segítettél.
    Logikus is amit írsz.
    Összezavart, hogy itt ugyanazt a téglalapot módosítjuk mindkét metódussal. :R

  • cadtamas

    tag

    Sziasztok.
    A tanuljuk meg a c++ nyelvet 24 óra alatt c. könyvből tanulok és az osztályoknál járok.
    Van néhány dolog amit nem értek a példafeladatban.
    Ez a header. Ez tiszta.
    #pragma once

    # include <iostream>

    class Point
    {
    private:
    int itsX;
    int itsY;

    public:
    void setX(int x) { int itsX = x; }
    void setY(int y) { int itsY = y; }
    int getX() const { return itsX; }
    int getY() const { return itsY; }

    };

    class Rectangle
    {
    public:
    Rectangle(int top, int left, int bottom, int right);
    //~Rectangle();

    int getRight() const { return itsRight; }
    int getLeft() const { return itsLeft; }
    int getTop() const { return itsTop; }
    int getBottom() const { return itsBottom; }

    Point getUpperLeft() const { return itsUpperLeft; }
    Point getLowerLeft() const { return itsLowerLeft; }
    Point getUpperRight() const { return itsUpperRight; }
    Point getLowerRight() const { return itsLowerRight; }

    void setUpperLeft(Point location);
    void setLowerLeft(Point location);
    void setUpperRight(Point location);
    void setLowerRight(Point location);

    void setRight(int right);
    void setLeft(int left);
    void setTop(int top);
    void setBottom(int bottom);

    int getArea() const;

    private:
    int itsTop;
    int itsBottom;
    int itsLeft;
    int itsRight;
    Point itsUpperLeft;
    Point itsUpperRight;
    Point itsLowerRight;
    Point itsLowerLeft;
    };

    Viszont itt több helyen elakadtam:
    #include "rect.h"

    Rectangle::Rectangle(int top, int left, int bottom, int right) //konstruktor, idáig rendben vagyunk
    {
    itsTop = top; //Ez elvileg az implementáció, amit nem taglal a könyv, hogy miért kell és később miért nem használjuk semmire.
    itsRight = right;
    itsLeft = left;
    itsBottom = bottom;

    itsUpperLeft.setX(left);
    itsUpperLeft.setY(top);

    itsUpperRight.setX(right);
    itsUpperRight.setY(top);

    itsLowerLeft.setX(left);
    itsLowerLeft.setY(bottom);

    itsLowerRight.setX(right);
    itsLowerRight.setY(bottom);
    }

    //ide kellene gondolom a destruktor, ami azért jó, mert memóriát szabadít fel?

    void Rectangle::setUpperLeft(Point location) //definiáljuk a függvényt
    {
    itsUpperLeft = location; //módosítja a változót ami elvileg az egyetlen feladata.
    itsUpperRight.setY(location.getY()); //módosítja a JobbFelső pont Y értékét, de miért???
    itsLowerLeft.setX(location.getX()); //módosítja a BalAlsó pont X értékét, de miért???
    itsTop = location.getY(); //a test felső vonalát határozza meg, de nem ez a dolga!!!
    itsLeft = location.getX(); //a test bal szélső vonalát határozza meg, de nem ez a dolga!!!
    }

    void Rectangle::setLowerLeft(Point location)
    {
    itsLowerLeft = location;
    itsLowerRight.setY(location.getY());
    itsUpperLeft.setX(location.getX());
    itsBottom = location.getY();
    itsLeft = location.getX();
    }

    void Rectangle::setLowerRight(Point location)
    {
    itsLowerRight = location;
    itsLowerLeft.setY(location.getY());
    itsUpperRight.setX(location.getX());
    itsBottom = location.getY();
    itsRight = location.getX();
    }

    void Rectangle::setUpperRight(Point location)
    {
    itsUpperRight = location;
    itsUpperLeft.setY(location.getY());
    itsLowerRight.setX(location.getX());
    itsTop = location.getY();
    itsRight = location.getX();
    }

    void Rectangle::setTop(int top) //beállítja a test felső vonalát. Ugyanazt mint a setUpperLeft() függvény. MIÉRT???
    {
    itsTop = top; //Ez lenne a dolga
    itsUpperLeft.setY(top); //Ez ugyanazt módosítja, mint a setUpperLeft() függvény. (Részben) De ez nem ennek a feladata...
    itsUpperRight.setY(top); //Ez ugyanazt módosítja, mint a setUpperRight() függvény. (Részben) De ez nem ennek a feladata...
    }

    void Rectangle::setLeft(int left)
    {
    itsLeft = left;
    itsUpperLeft.setX(left);
    itsLowerLeft.setX(left);
    }

    void Rectangle::setBottom(int bottom)
    {
    itsBottom = bottom;
    itsLowerLeft.setY(bottom);
    itsLowerRight.setY(bottom);
    }

    void Rectangle::setRight(int right)
    {
    itsRight = right;
    itsUpperRight.setX(right);
    itsLowerRight.setX(right);
    }

    int Rectangle::getArea() const
    {
    int width = itsRight - itsLeft;
    int height = itsTop - itsBottom;
    return (width*height);
    }

    int main()
    {
    Rectangle MyRectangle(100, 20, 50, 80); //Létrehozzuk a négyszöget

    int Area = MyRectangle.getArea();

    std::cout << "Terulet: " << Area << "\n";
    std::cout << "Bal felso pont x koordinataja: ";
    std::cout << MyRectangle.getUpperLeft().getX()<< std::endl; //ennek 20-nak kellene lennie, de nem annyi.
    system("pause");
    return 0;
    }

    Kommenteltem, ami nem világos. Tudnátok segíteni, hogy megértsem mi, miért történik?

  • cadtamas

    tag

    válasz dobragab #3876 üzenetére

    Hazudnék, ha azt mondanám, hogy minden világos, de remélem ahogy haladok a tananyaggal majd megvilágosodok. Eddig nem volt bajom a könyvvel, de azt észrevettem, hogy nem bajlódik az alapokkal és bizonyos tudásszintet természetesnek vesz.
    Kezdőknek semmiképp sem ajánlanám.
    Egy éve tanulom a pythont, csak az unreal engine miatt kénytelen vagyok megtanulni a c++ alapjait is. Nem volt rossz ötlet azzal kezdeni, egyes dolgokat jóval nagyvonalúbban kezel. :)

  • cadtamas

    tag

    válasz dabadab #3874 üzenetére

    Nagyon köszönöm a válaszod.

    A fő felhasználási terület a függvények paramétereinél van. A paramétereket alapvetően átadhatjuk értékként vagy hivatkozásként: ha értékként adjuk át, akkor ha a függvényben bizergáljuk, az nincs kihatással az eredeti változóra - ha hivatkozásként, akkor meg igen.

    Ha a függvény feladata egy változó módosítása, akkor miért nem adjuk meg a függvény visszatérési értékének ezt az értéket és írjuk felül az eredeti változót?

    A másik felhasználás az, amikor new-val hozunk létra objektumokat, hogy az élettartamuk független legyen annak a függvénynek az élettartamától, amelyik létrehozza őket (ugye a helyi változók csak addig élnek, amíg a függvény le nem fut - ha new-val hozol létre valamit, az meg addig, amíg rá nem küldesz egy delete-et).

    Erre tudnál adni valami pédát, mert nem értem miért lenne szükségem bármire egy függvényből annak lefutása után. (kivéve persze az eredményt) Vagy ha szükségem van rá, akkor miért nem a programtörzsben deklarálom?

  • cadtamas

    tag

    Sziasztok, pár hete tanulom a c++ nyelvet és a Tanuljunk meg programozni c++ nyelven 24 óra alatt c. könyvet használom. Eljutottam a mutatók/hivatkozások témakörhöz és egy kissé megakadtam.
    Valójában teljes a káosz.
    Azt nem fejti ki rendesen, hogy miért kellenek a mutatók/hivatkozások, de azt igen, hogy miket ne csináljak mert ha törölt hivatkozásra mutat a mutató akkor túlcsordul a memória és az internet letörli önmagát, aztán összecsomagol és visszaköltözik az anyjához.

    Itt van ez a példaprogram:
    //12.5 Lista
    //A memóriszivárgás javítása
    #include <iostream>

    class SimpleCat //létrehozom az osztályt, minden frankó
    {
    public:
    SimpleCat(int age, int weight);
    ~SimpleCat() {}
    int GetAge() { return itsAge; }
    int GetWeight() { return itsWeight; }

    private:
    int itsAge;
    int itsWeight;
    };

    SimpleCat::SimpleCat(int age, int weight) : //deklaráljuk a simplecat osztályt
    itsAge(age), itsWeight(weight) {} //Gondolom itt meg azonnal meghívjuk a függvényeit, bár ilyet még korábban nem láttam

    SimpleCat & TheFunction(); //Ez egy funkció, de lövésem sincs, miért így kell megadni és innentől elveszítem a fonalat

    int main()
    {
    SimpleCat & rCat = TheFunction();
    int age = rCat.GetAge();
    std::cout << "rCat is " << age << " years old!\n";
    std::cout << "&rCat: " << &rCat << std::endl;
    SimpleCat*pCat = &rCat;
    delete pCat;
    return 0;
    }

    SimpleCat & TheFunction()
    {
    SimpleCat * pFrisky = new SimpleCat(5, 9);
    std::cout << "pFrisky: " << pFrisky << std::endl;
    return *pFrisky;
    }

    Segítenétek nekem a helyére rakni a dolgokat?
    De valami emberi nyelven megfogalmazva.
    Miért kellenek a mutatók és a hivatkozások és mire használjuk őket?

Új hozzászólás Aktív témák

Hirdetés