Avatar billede evilfish Nybegynder
15. maj 2008 - 14:35 Der er 3 kommentarer og
1 løsning

Oprette et objekt med et andet objekt som parameter

Hej eksperter

Jeg har et problem, som jeg lige pt ikke forstår noget som helst af.

Jeg har lavet 3 klasser, hvor nogle af dem arbejder sammen. Her ses en af mine constructorer som virker:

ReportCreator::ReportCreator(int n, int l, Connection &connection)
{
    notify = n;
    limit = l;
    initialize();
    con = connection;
}

Læg mærke til at den har Connection som parameter, hvilket er min klasse. Dette fungerer fint. Her komme den næste:

Simulator::Simulator(ReportCreator &rptcrt)
{
  report = rptcrt;
}

Denne fejler bravt. OG jeg kan ikke forstå fejl, for compileren giver en masse fejl, som jeg ikke forstå rså meget af. Noget med at noget er private. Smøren står nederst.

Jeg vil tror det måske har noget at gøre med at jeg ikke har defineter en = operator, men det har jeg ikke ved den første, og det fungerer fint.

Nogen der ved hvad der kan være galt. Hvis i har brug for mere information, så skriv endelig.

/usr/include/c++/4.2.1/bits/ios_base.h: In member function ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2.1/bits/ios_base.h:782: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private
/usr/include/c++/4.2.1/iosfwd:55: error: within this context
/usr/include/c++/4.2.1/iosfwd: In member function ‘std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::operator=(const std::basic_ostream<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2.1/iosfwd:64: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’ first required here
/usr/include/c++/4.2.1/iosfwd: In member function ‘std::basic_ofstream<char, std::char_traits<char> >& std::basic_ofstream<char, std::char_traits<char> >::operator=(const std::basic_ofstream<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2.1/iosfwd:92: note: synthesized method ‘std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::operator=(const std::basic_ostream<char, std::char_traits<char> >&)’ first required here
/usr/include/c++/4.2.1/streambuf: In member function ‘std::basic_filebuf<char, std::char_traits<char> >& std::basic_filebuf<char, std::char_traits<char> >::operator=(const std::basic_filebuf<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2.1/streambuf:802: error: ‘std::basic_streambuf<_CharT, _Traits>& std::basic_streambuf<_CharT, _Traits>::operator=(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]’ is private
/usr/include/c++/4.2.1/iosfwd:86: error: within this context
/usr/include/c++/4.2.1/iosfwd: In member function ‘std::basic_ofstream<char, std::char_traits<char> >& std::basic_ofstream<char, std::char_traits<char> >::operator=(const std::basic_ofstream<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2.1/iosfwd:92: note: synthesized method ‘std::basic_filebuf<char, std::char_traits<char> >& std::basic_filebuf<char, std::char_traits<char> >::operator=(const std::basic_filebuf<char, std::char_traits<char> >&)’ first required here
ReportCreator.h: In member function ‘ReportCreator& ReportCreator::operator=(const ReportCreator&)’:
ReportCreator.h:21: note: synthesized method ‘std::basic_ofstream<char, std::char_traits<char> >& std::basic_ofstream<char, std::char_traits<char> >::operator=(const std::basic_ofstream<char, std::char_traits<char> >&)’ first required here
Simulator.cc: In constructor ‘Simulator::Simulator(ReportCreator&)’:
Simulator.cc:12: note: synthesized method ‘ReportCreator& ReportCreator::operator=(const ReportCreator&)’ first required here
make[1]: *** [build/Debug/GNU-Linux-x86/Simulator.o] Error 1
Avatar billede arne_v Ekspert
15. maj 2008 - 14:56 #1
Hvordan kalder du Simulator constructor ?
Avatar billede evilfish Nybegynder
15. maj 2008 - 15:02 #2
Jeg har faktisk lige fået det til at virke:

Jeg kaldte den således: Simulator sim(rptcreator);

Men en gut der kom forbi mig hjalp. Vi ved ikke helt hvorfor det ikke virkede, men vi ændrede vores kald til: Simulator sim(&rptcreator);

Herefter lavede vi alt der havde med objektet at gøre inde i Simulator til pointeres. Og så fungerede det
Avatar billede segmose Nybegynder
16. maj 2008 - 09:54 #3
De her fejl meldinger virker alt for uoverskuelige, men hvis man scanner hen over den første del finder vi på et tidspunkt "is private" og lige før det stårerror:

‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private

Som er den reelle fejl, assignment operatoren er privat for ios_base.
I bunden står så

Simulator.cc:12: note: synthesized method ‘ReportCreator& ReportCreator::operator=(const ReportCreator&)’ first required here

Hvis jeg fortolker det ritigt vil den have dig til at skrive en assignment operator fr ReportCreator, men det vil aligevel fejle i sidste ende da basic_ios's assignment operator er privat.

I din kode:
Simulator::Simulator(ReportCreator &rptcrt)
{
  report = rptcrt; // assignment operator
}

Nu har du lavet det om til en pointer til rptcreator som man så gerne må assigne, du skal bare være opmærksom på at det ikke er en kopi af din rptcreator længere du arbejder med så hvis den oprindelige rptcreator går ud af scope eller blive deallokeret på anden hvis springer det i luften :)
Avatar billede evilfish Nybegynder
03. juni 2008 - 11:32 #4
Tak for forklaringen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester