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?
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?
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;
}
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;
}
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);
}
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.