Archief - [Prog][C++]Object doorgeven als referentie

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Hellsgamerz

Legacy Member
Ik ben een paar dingen aan het proberen in C++ uit te werken. Een probleem waar ik mee zit is een object doorgeven als referentie. Concrete situatie uit een schoolprobleem van java: een 'borrowing' object bevat een 'book' en een 'member' (het gaat om een bibliotheek). Wijzigingen via borrowing aan dat book/member object moeten ook effectief gebeuren, daarom dus pass by ref.

Volgende code:

Code:
//include blaat overgeslagen
class Borrowing
{
    public:
        Borrowing();
        Borrowing(Member::Member &member, Book::Book& book); //lijkt me goed te zijn
    private:
        Member::Member& member; //niet zeker van dit 
        Book::Book& book;         //maar hoe moet het anders?
};

zou moeten werken, maar ik weet niet zeker of ik de members wel correct declareer. Ik krijg fouten bij de constructor, maar dat is mss omdat dit al fout zit...

Litheon

Legacy Member
Code:
//include blaat overgeslagen
class Book
{
public: 
 Book();
~Book();

// ... boek gedoe
};

class Member
{
public:
Member();
~Member();

// .. member gedoe
};

class Borrowing
{
    public:
        Borrowing();
        Borrowing(Member &_member, Book& _book)
        {
             // ik DENK dat je dan dit wil gaan doen, wat het gebruik van
// references nutteloos maakt:
               member = _member; 
               book = _book;
         }
// geen dubbelepunten gebruiken (tenzij je met klassen in klassen zit of met namespaces maar dus normaal niet)
// en zie natuurlijk dat de variabelen in de functies niet dezelfde naam hebben als variabelen in uw klasse zelf (daarom dat ik er een "_" voorgezet heb zodat ze nietdezelfde zijn)                                                                    
    private:
        Member    member;     //niet zeker van dit 
        Book       book;         //maar hoe moet het anders?
// awel  gewoon declareren (bij een reference zal je alleen 
dus een "&" teken moeten gebruiken in de declaratie/defenitie van uw functies) 
};



Als ik denk wat je wil doen: dus bij de constructor de variabelen meegeven en die dan in uw klasse "zetten" zodat je er altijd aan kan in je klasse zal deze code NIET werken (simpelweg omdat je die reference gaat kopiëren naar een variabele in uw eigen klasse). Je kan dan beter gebruik maken van pointers. Ik kan het allemaal zeer slecht uit leggen....

Misschien moet je gewoon even terug een C++ boek openen over References en Pointers..

Hoe ik het zou doen:

Code:
//include blaat overgeslagen
class Book
{
public: 
 Book();
~Book();

// ... boek gedoe
};

class Member
{
public:
Member();
~Member();

// .. member gedoe
};

class Borrowing
{
    public:
        Borrowing(Member *_member, Book * _book):m_pMember(_member),m_pBook(_book)
        {}       
              

                                                      
    private:
        Member    *m_pMember;   
        Book       *m_pBook;         

};

Rip7

Legacy Member
Ik zou niet weten waarom je zou willen gebruikmaken van pointers in dit geval. Hetzelfde wat je doet werkt ook prima met references (verschil pointer<->references is dat een reference nooit NULL kan zijn, en waar hij naartoe verwijst kan niet verandert worden ...)

Code:
class Borrowing
{
    public:
        //Borrowing();
        Borrowing(int &test) : member(test) {std::cout << member << std::endl;}
                                                                    
    private:
        int &member;
 
};
	
int main()
{
	int Testen = 13;
	Borrowing newer(Testen);
	return 0;
}

Psychokillah

Legacy Member
Rip7 zei:
Ik zou niet weten waarom je zou willen gebruikmaken van pointers in dit geval. Hetzelfde wat je doet werkt ook prima met references (verschil pointer<->references is dat een reference nooit NULL kan zijn, en waar hij naartoe verwijst kan niet verandert worden ...)

Zoals ik de siuatie een beetje bekijk (en ik veronderstel dus dat elke keer een lid een boek leent een object Borrowing wordt aangemaakt :confused: ) is het idd beter om references te gebruiken.

References kun je best bekijken als "een andere variablenaam, voor een ZELFDE variablewaarde". En in jou situatie zullen Member en Book dus niet aangepast moeten worden, dus is het gebruik van pointers ook volstrekt overbodig.

Waar het probleem zit is volgens mij gewoon de dubbele punten. Een object van Member kan je gewoon declareren met Member (en dus niet Member::Member, tenzij dit moest behoren tot de namespace Member).


Maar iets anders: even over je project in het algemeen. Ik weet neit hoe het in zijn werk gaat, maar is de klasse Borrowing niet een beetje overbodig? Kan je niet beter een lijst van boeken bijhouden in de Member-klasse? Zo ga je alvast minder overhead hebben. Maja, ik ken de opgave niet, dus deze alinea mag je evengoed negeren ;)

Litheon

Legacy Member
ja, juist, sorry, had op het moment niet aan gedacht om " int &member; " zo te declareren...zelf gebruik ik eigelijk altijd pointers naar klassen omdat je daar idd NULL aan kan toekennen, vindt die vrijheid wel "leuk", daarom

Psychokillah

Legacy Member
Litheon zei:
ja, juist, sorry, had op het moment niet aan gedacht om " int &member; " zo te declareren...zelf gebruik ik eigelijk altijd pointers naar klassen omdat je daar idd NULL aan kan toekennen, vindt die vrijheid wel "leuk", daarom

mm, dat is nu niet meteen de beste gedachtengang hoor, "ik vind het properder om met pointers te werken". Je kan met pointers hetzelfde resultaat bekomen als references, maar in vele gevallen is het vaak aangewezen om references te gebruiken. In een simpel huis, tuin en keuken programmaatje maakt dat nu niet veel uit. Maar in grotere projecten ga je op die manier toch wel wat gehugen transacties uitsparen hoor en gaat je code ook minder snel breken. Dus best nog es wat info naslagen over references en ze ook gebruiken waar nodig is de beste manier, anders ga je verkeerde gewoontes kweken.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan