[IPR] Classes en namespaces

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

User avatar
Flipper
Posts: 193

[IPR] Classes en namespaces

Post#1 » Fri Dec 28, 2012 10:47 am

Ik wilde de operator << overloaden voor een class, gedefinieerd in een namespace, maar er loopt iets mis:

Code: Select all


namespace Horses {

class Horse {
private:
string name;
vector<string> traject;

public:
...
friend ostream& operator<< (ostream& display, const Horses::Horse& object);
};

}
Ik krijg dan de melding:

Code: Select all


horse.cpp: In functie ‘std::ostream& operator<<(std::ostream&, const Horses::Horse&)’:
horse.cpp:17:28: fout: ‘std::vector<std::basic_string<char> > Horses::Horse::traject’ is private
horse.cpp:44:27: fout: within this context
Terwijl ik toch echt expliciet (mbv friend) heb gezegd dat die operator overloading daar toch toegang heeft?

Het gekste (of voor juliie misschien niet gek :P ) is dat wanneer ik de class buiten de namespace brengt, dit geen problemen geeft.. :shock:

Code: Select all


class Horse {
private:
string name;
vector<string> traject;

public:
...
friend ostream& operator<< (ostream& display, const Horse& object);
};

namespace Horses {
...
}
They call him Flipper, Flipper, faster than lightning,
No-one you see, is smarter than he,
And we know Flipper, lives in a world full of wonder,
Flying there-under, under the sea!

User avatar
Joachimvdh
Prosenior
Posts: 1092

Re: [IPR] Classes en namespaces

Post#2 » Fri Dec 28, 2012 4:44 pm

Iets meer info over waar ge uw functie hebt neergepoot. Waar steekt uw functie definitie? in de namespace of erbuiten?

User avatar
Flipper
Posts: 193

Re: [IPR] Classes en namespaces

Post#3 » Fri Dec 28, 2012 5:56 pm

Joachimvdh wrote:Iets meer info over waar ge uw functie hebt neergepoot. Waar steekt uw functie definitie? in de namespace of erbuiten?
De definitie staat buiten de namespace:

Code: Select all


ostream& operator<< (ostream& display, const Horses::Horse& object);
They call him Flipper, Flipper, faster than lightning,
No-one you see, is smarter than he,
And we know Flipper, lives in a world full of wonder,
Flying there-under, under the sea!

User avatar
Joachimvdh
Prosenior
Posts: 1092

Re: [IPR] Classes en namespaces

Post#4 » Fri Dec 28, 2012 6:33 pm

Ge maakt het u bizar moeilijk eigenlijk.

a) ge hebt de declaratie gepost, niet de definitie ;)

b) zo werkt het:

Code: Select all

#include <vector>
#include <string>
#include <iostream>

using namespace std;

namespace Horses {
class Horse;
}

ostream& operator<< (ostream& display, const Horses::Horse& object);

namespace Horses {

class Horse {
private:
string name;
vector<string> traject;

public:
friend ostream& ::operator<< (ostream& display, const Horses::Horse& object);
};


}

ostream& operator<< (ostream& display, const Horses::Horse& object) {
display << object.traject[0];
return display;
}

int main() {
return 0;
}
uw friend declaratie in de klasse ziet uw overload functie niet, want die hebt ge in de global namespace (::) gezet. Daar moet ge dus in de klasse naar verwijzen. De reden dat ik vind dat ge het u moeilijk maakt is dat:
- de declaratie van uw functie moet voor uw klasse komen, daar staat dan weer uw klasse in, die moet dus worden geforward declared en daarvoor moet uw namespace weer open. (ik weet niet, wrs staat dat in headers bij u ?)
- Het is wel gewoon netjes om uw overloaded operator in dezelde namespace als uw klasse te zetten
- Ik zou die operator als member van de klasse definieren, niet als standalone functie als friend

JR
Posts: 23

Re: [IPR] Classes en namespaces

Post#5 » Thu Jan 03, 2013 5:15 pm

Ge kunt de operator<< natuurlijk niet in uw klasse definieren omdat het eerste argument de stream is en niet het object
Standaardmethode voor wie geen friends wil is om een methode

Code: Select all

ostream& toStream (ostream&)
in uw klasse te steken, de operator buiten de klasse overloaden en in de overload functie, de methode callen:

Code: Select all

ostream& operator<< (ostream& display, const Horses::Horse& object) {
return object.toStream(display);
}

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 4 guests

cron