Du är helt fel ute.Titta på de här ni som kan C++! Objekt och grejer.
Jag behöver hjälp med ett program för ett skol-projekt.
Jag skall med hjälp av ett dynamiskt allokerat objekt i main funktionen
komma åt en funktion i en annan fil. Funktionen i andra
filen klagar på att objektet är odeklarerat. Hur skall
jag lättast komma åt objektet i andra funktionen?
I main funktionen har jag allokerat minne för Person objektet.
i For loopen försöker jag kalla på visa() funktionen, men programmet
hänger upp sig.
Person *pers[antal];
pers[j] = new Person;
for(j = 0; j < antal; j++)
{
cout << "Ge namn och f" << oo << "delse" << ao << "r " <<
ao << "t person " << j+1 << ":" << endl;
cout << "Ge personens namn: ";
pers[j]->setName();
cout << "Ge personens f" << oo << "delse" << ao <<"r" <<
"(t ex 1981): ";
pers[j]->setbYear();
pers[j]->visa(); //Här hänger programmet upp sig.
}
I visa() funktionen nedan har jag igen allokerat person-objekt. Jag tror
att detta är fel. Jag skulle gärna försöka vara utan att allokera ett nytt
objekt i denna funktion. Jag skulle vilja att visa() funktionen skulle
referera till main funktionens objekt. Kan man lösa detta med
t.ex copy-konstruktor eller pekare?
void Person::visa()
{
int j;
extern int antal;
Person *pers[antal];
pers[j] = new Person;
for(j = 0; j < antal; j++)
{
cout << "Person" << j+1 << ":" << endl;
cout << "Namn\t :" << pers[j]->getName() << endl;
cout << "F"<<oo<<"delse"<<ao<<"r :" << pers[j]->getbYear() << endl;
cout << AO << "lder\t:" << pers[j]->countAge(pers[j]->getbYear()) << endl;
}
}Sv: Titta på de här ni som kan C++! Objekt och grejer.
Kort:
1. En klass skall representera utseendet på ett objekt. Flera objekt kan skapas utifrån klassen.
2. En metod för en klass ska representera en metod på ett enda objekt. Metoden kan anropas på flera objekt.
<b>>I visa() funktionen nedan har jag igen allokerat person-objekt. Jag tror
att detta är fel. Jag skulle gärna försöka vara utan att allokera ett nytt
objekt i denna funktion.</b>
Enligt ovan är det naturligtvis fel.
<b>>Jag skulle vilja att visa() funktionen skulle
referera till main funktionens objekt.</b>
I princip skulle du kunna det, men det är garanterat helt fel väg att gå. Sträva efter att låta alla delar av ett program känna till så lite som möjligt av sin omgivning.
<b>>Kan man lösa detta med
t.ex copy-konstruktor eller pekare?</b>
Nej, nej... tänk om!
Jag ska kort visa hur du kan skriva detta (det är ingen riktig kod, det är bara för att se principen):
class Person
{
public:
//kanske en konstruktor, det är nog lämpligt
void visa();
//... massa mer grejer
private:
std::string namn;
int alder;
} ;
void Person::visa()
{
std::cout << "Namn: " << namn << std::endl << "Ålder: " << alder;
}
//...
int main()
{
Person[20] personer;
//initiera dem
//...
for(int i=0; i<20; i++)
Person[i].visa();
}
Sen bör du definitivt använda std::vector istället för arrayer. Återkom om du har mer frågor eller om du inte förstår. Det blev lite snabbt och hafsigt som sagt.