Kysyttävää c++:sta

Elikkäs olis sellainen ongelma, että miten saada tieto liikkumaan kahden eri luokissa sijaitsevan funktion välillä.
Tavoitteena olisi saada pointerin tiedot funktiosta1 funktioon2 eli vain yhteen suuntaan.
Testailin seuraavanlaista koodinpätkää:

tiedosto1.cpp

#include "tiedosto2.h"

Tiedosto1::funktio1() //Luokan Tiedosto1 funktio
{
data *d; //Tämä tiedosto pitäis siirtää
funktio2 *f2; //ja tänne se olisi siirrettävä
f2->tanne = d;
}

----------------

tiedosto2.h

class
{
public:
data *tanne;
...
};

Mutta tässä taitaa olla jonkinlaista vibaa. Entä muita tapoja tehdä tällainen operaatio. Olisiko jotenkin mahdollista tehdä funktion sisäisestä pointerista globaali?
7436
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

Olisi ollut kiva jos olisit laittanut vähän enemmän koodia. Ilman sitä en voi tehdä kuin esimerkin

class Tiedosto
{
public:
   data * tieto;
   void siirra(data * lahde);
};

void Tiedosto::siirra(data * lahde)
{
   tieto=lahde;
   return;
}

int main()
{
   Tiedosto t1;
   Tiedosto t2;

   //siiretään t1 -> t2
   t2.siirra(t1.tieto);

   //sja takasi t2 -> t1
   t1.siirra(t2.tieto);
   
   return 0;
}

Äänestä
  • Tän pitäs toimii paremmin.

    class Tiedosto
    {
    public:
       data * tieto;
       void siirra(data * lahde);
    };

    void Tiedosto::siirra(data * lahde)
    {
       *tieto=*lahde;
       return;
    }

    int main()
    {
       Tiedosto t1;
       Tiedosto t2;

       *t1.tieto=(data)2322;

       //siiretään t1 -> t2
       t2.siirra(t1.tieto);

       //sja takasi t2 -> t1
       t1.siirra(t2.tieto);
       
       return 0;
    }

    Äänestä

  • Koodien kingi kirjoitti:

    Tän pitäs toimii paremmin.

    class Tiedosto
    {
    public:
       data * tieto;
       void siirra(data * lahde);
    };

    void Tiedosto::siirra(data * lahde)
    {
       *tieto=*lahde;
       return;
    }

    int main()
    {
       Tiedosto t1;
       Tiedosto t2;

       *t1.tieto=(data)2322;

       //siiretään t1 -> t2
       t2.siirra(t1.tieto);

       //sja takasi t2 -> t1
       t1.siirra(t2.tieto);
       
       return 0;
    }

    Onhan siihe yksi kertaismepikin tapa.

    class Tiedosto
    {
    public:
    data * tieto;
    void siirra(data * lahde);
    };

    void Tiedosto::siirra(data * lahde)
    {
    *tieto=*lahde;
    return;
    }

    int main()
    {
    Tiedosto t1;
    Tiedosto t2;

    //siiretään t1 -> t2 !!!!!!!!!!!
    t1.tieto=t2.tieto;

    return 0;
    }

    Äänestä

  • kingi kirjoitti:

    Onhan siihe yksi kertaismepikin tapa.

    class Tiedosto
    {
    public:
    data * tieto;
    void siirra(data * lahde);
    };

    void Tiedosto::siirra(data * lahde)
    {
    *tieto=*lahde;
    return;
    }

    int main()
    {
    Tiedosto t1;
    Tiedosto t2;

    //siiretään t1 -> t2 !!!!!!!!!!!
    t1.tieto=t2.tieto;

    return 0;
    }

    Kiitän vinkistä. Sain siitä jotain irti, mutta vielä olis seuraavanlainen ongelma.

    Elikkäs koodi näyttää suht pseudokoodina tältä:
    Tiedosto1.h:

    Selvennyksen vuoksi data on eräs kirjasto ja kumpaakin luokkaa ennen on #include "data.h" jolla viitataan kyseiseen kirjastoon.

    class Tiedosto1
    {
    public:
    data *d1;

    private:
    void funktio1()
    };



    Tiedosto1.cpp

    void Tiedosto1::funktio1()
    {
    /*Suoritetaan jotain dataa aluksi*/
    d1 = jotain suoritettua dataa; //Tää pointeri //osoittaa siis datan sijaintiin
    Tiedosto2 *t2;
    t2->Siirra(d1);
    }



    Tiedosto2.h:

    class Tiedosto2
    {
    public:
    void Siirra(data *d1);
    data *d2;
    };



    Tiedosto2.cpp

    void Tiedosto2::Siirra(data *d1)
    {
    d2 = 0;
    d2 = d1;
    return;
    }

    Ongelmia tulee tässä Siirra-funktiossa. Jostain syystä d2 ei halua ottaa mitään tietoa vastaan tämän funktion sisällä. d1-pointeri kyllä näyttää samaa lukemaa kuin ensimmäisen tiedoston funktiolta lähdettäessä. Ainoastaan silloin jos ohjelmassa luodaan funktion sisällä data-kirjaston pointeri:

    void Tiedosto2::Siirra(data *d1)
    {
    data *d2 = 0;
    d2 = d1;
    return;
    }

    , niin d1:n luovuttaa tietonsa sille. Tästä taas ei ole mitään hyötyä kun se on vain funktion sisäinen.

    Äänestä

  • Juuba kirjoitti:

    Kiitän vinkistä. Sain siitä jotain irti, mutta vielä olis seuraavanlainen ongelma.

    Elikkäs koodi näyttää suht pseudokoodina tältä:
    Tiedosto1.h:

    Selvennyksen vuoksi data on eräs kirjasto ja kumpaakin luokkaa ennen on #include "data.h" jolla viitataan kyseiseen kirjastoon.

    class Tiedosto1
    {
    public:
    data *d1;

    private:
    void funktio1()
    };



    Tiedosto1.cpp

    void Tiedosto1::funktio1()
    {
    /*Suoritetaan jotain dataa aluksi*/
    d1 = jotain suoritettua dataa; //Tää pointeri //osoittaa siis datan sijaintiin
    Tiedosto2 *t2;
    t2->Siirra(d1);
    }



    Tiedosto2.h:

    class Tiedosto2
    {
    public:
    void Siirra(data *d1);
    data *d2;
    };



    Tiedosto2.cpp

    void Tiedosto2::Siirra(data *d1)
    {
    d2 = 0;
    d2 = d1;
    return;
    }

    Ongelmia tulee tässä Siirra-funktiossa. Jostain syystä d2 ei halua ottaa mitään tietoa vastaan tämän funktion sisällä. d1-pointeri kyllä näyttää samaa lukemaa kuin ensimmäisen tiedoston funktiolta lähdettäessä. Ainoastaan silloin jos ohjelmassa luodaan funktion sisällä data-kirjaston pointeri:

    void Tiedosto2::Siirra(data *d1)
    {
    data *d2 = 0;
    d2 = d1;
    return;
    }

    , niin d1:n luovuttaa tietonsa sille. Tästä taas ei ole mitään hyötyä kun se on vain funktion sisäinen.

    En nytehtiny kauheesti käänyäjän avulla ihmettelemään mutta.

    koita ny vaikka tät alkuu

    void Tiedosto1::funktio1()
    {
    /*Suoritetaan jotain dataa aluksi*/
    d1 = jotain suoritettua dataa; //Tää pointeri //osoittaa siis datan sijaintiin
    Tiedosto2 *t2 = new Tiedosto2; Taisit otat ton *merkin pois
    t2->Siirra(d1);
    }

    Äänestä

  • Juuba kirjoitti:

    Kiitän vinkistä. Sain siitä jotain irti, mutta vielä olis seuraavanlainen ongelma.

    Elikkäs koodi näyttää suht pseudokoodina tältä:
    Tiedosto1.h:

    Selvennyksen vuoksi data on eräs kirjasto ja kumpaakin luokkaa ennen on #include "data.h" jolla viitataan kyseiseen kirjastoon.

    class Tiedosto1
    {
    public:
    data *d1;

    private:
    void funktio1()
    };



    Tiedosto1.cpp

    void Tiedosto1::funktio1()
    {
    /*Suoritetaan jotain dataa aluksi*/
    d1 = jotain suoritettua dataa; //Tää pointeri //osoittaa siis datan sijaintiin
    Tiedosto2 *t2;
    t2->Siirra(d1);
    }



    Tiedosto2.h:

    class Tiedosto2
    {
    public:
    void Siirra(data *d1);
    data *d2;
    };



    Tiedosto2.cpp

    void Tiedosto2::Siirra(data *d1)
    {
    d2 = 0;
    d2 = d1;
    return;
    }

    Ongelmia tulee tässä Siirra-funktiossa. Jostain syystä d2 ei halua ottaa mitään tietoa vastaan tämän funktion sisällä. d1-pointeri kyllä näyttää samaa lukemaa kuin ensimmäisen tiedoston funktiolta lähdettäessä. Ainoastaan silloin jos ohjelmassa luodaan funktion sisällä data-kirjaston pointeri:

    void Tiedosto2::Siirra(data *d1)
    {
    data *d2 = 0;
    d2 = d1;
    return;
    }

    , niin d1:n luovuttaa tietonsa sille. Tästä taas ei ole mitään hyötyä kun se on vain funktion sisäinen.

    En oikein älyä miksei public-määriteltyyn d2 pointeriin saanun laitettua mitään sisälle.
    Tein sitten structin samaan Tiedosto2.h tiedostoon tuon luokan kanssa ja määrittelin d2:n siellä.
    Sitten ajoin Siirra-funktiossa tiedot structiin:

    void Tiedosto2::Siirra(data *d1)
    {
    struct testi t;
    t.data = d1;

    }
    Johan toimii..

    Äänestä

  • Juuba kirjoitti:

    En oikein älyä miksei public-määriteltyyn d2 pointeriin saanun laitettua mitään sisälle.
    Tein sitten structin samaan Tiedosto2.h tiedostoon tuon luokan kanssa ja määrittelin d2:n siellä.
    Sitten ajoin Siirra-funktiossa tiedot structiin:

    void Tiedosto2::Siirra(data *d1)
    {
    struct testi t;
    t.data = d1;

    }
    Johan toimii..

    Moi,

    nyt on pointterit, viittaukset, staattiset ja dynaamiset muuttujat sekaisin. Ei ole mitään järkeä luoda public muuttujaa luokkaan ja kirjoittaa sille funktio, joka antaa muuttujalle uuden arvon. Olio-ohjelmoinnin perusidea on kapseloida luokan muuttuja, eli tarkoittaa sitä, ettei muuttujien arvoja voida muuttaa suoraan luokan pointterin avulla.

    Äänestä

Kommentoi aloitusta


Juuba kirjoitti:

Elikkäs olis sellainen ongelma, että miten saada tieto liikkumaan kahden eri luokissa sijaitsevan funktion välillä.
Tavoitteena olisi saada pointerin tiedot funktiosta1 funktioon2 eli vain yhteen suuntaan.
Testailin seuraavanlaista koodinpätkää:

tiedosto1.cpp

#include "tiedosto2.h"

Tiedosto1::funktio1() //Luokan Tiedosto1 funktio
{
data *d; //Tämä tiedosto pitäis siirtää
funktio2 *f2; //ja tänne se olisi siirrettävä
f2->tanne = d;
}

----------------

tiedosto2.h

class
{
public:
data *tanne;
...
};

Mutta tässä taitaa olla jonkinlaista vibaa. Entä muita tapoja tehdä tällainen operaatio. Olisiko jotenkin mahdollista tehdä funktion sisäisestä pointerista globaali?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu