Föreläsningsanteckningar OOP-föreläsning 6, tisdag 18 september 2007 ==================================================================== Idag ==== 1. Repetition: virtuella funktioner 2. Abstrakta klasser 3. .NET: ref, override mm 4. Strängar i C, C++ och .NET Om vi hinner: 5. Operatorer och operatoröverlagring 6. I/O med << och >> 7. Tilldelning (operator=) och initiering 1. Repetition: virtuella funktioner =================================== djur1.cpp --------- #include class Djur { public: virtual void ljud(); }; class Katt : public Djur { public: virtual void ljud(); }; class Hund : public Djur { public: virtual void ljud(); }; void Djur::ljud() { std::cout << "Ja, hur sjutton låter ett djur...?" << std::endl; } void Katt::ljud() { std::cout << "Mjau!" << std::endl; } void Hund::ljud() { std::cout << "Vov!" << std::endl; } int main() { Djur* d = new Djur; Djur* k1 = new Katt; Katt* k2 = new Katt; Hund* h = new Hund; d->ljud(); k1->ljud(); k2->ljud(); h->ljud(); } Utmatning från programmet ------------------------- Ja, hur sjutton låter ett djur...? Mjau! Mjau! Vov! 2. Abstrakta klasser ==================== djur2.cpp --------- #include class Djur { public: virtual void ljud() = 0; }; class Katt : public Djur { public: virtual void ljud(); }; class Hund : public Djur { public: virtual void ljud(); }; void Katt::ljud() { std::cout << "Mjau!" << std::endl; } void Hund::ljud() { std::cout << "Vov!" << std::endl; } int main() { // Djur* d = new Djur; -- Går inte, eftersom klassen Djur är abstrakt! Djur* k1 = new Katt; Katt* k2 = new Katt; Hund* h = new Hund; // d->ljud(); k1->ljud(); k2->ljud(); h->ljud(); } Felmeddelanden från kompilatorn ------------------------------- djur2.cpp:27: error: cannot allocate an object of type `Djur' djur2.cpp:27: error: because the following virtual functions are abstract: djur2.cpp:5: error: virtual void Djur::ljud() 3. .NET: ref, override mm ========================= ("ref" stavades "__gc" i Visual Studio .NET 2003.) visual-djur2.cpp ---------------- #include "stdafx.h" ref class Djur abstract { public: virtual void ljud() = 0; }; ref class Katt : public Djur { public: virtual void ljud() override; }; ref class Hund : public Djur { public: virtual void ljud() override; }; void Katt::ljud() { System::Console::WriteLine("Mjau!"); } void Hund::ljud() { System::Console::WriteLine("Vov!"); } int main() { // Djur^ d = gcnew Djur; -- Går inte! Djur^ k1 = gcnew Katt; Katt^ k2 = gcnew Katt; Hund^ h = gcnew Hund; // d->ljud(); k1->ljud(); k2->ljud(); h->ljud(); } 4. Strängar i C, C++ och .NET ============================= cstrings.cpp (hitta ett allvarligt fel!) ------------ #include #include int main() { char s1[] = "Hej!"; std::cout << s1 << std::endl; char s2[] = "Hopp!"; char s3[strlen(s1) + strlen(s2) + 1]; strcpy(s3, s1); strcat(s3, " "); strcat(s3, s2); std::cout << s3 << std::endl; } Utmatning från programmet ------------------------- Hej! Hej! Hopp! cppstrings.cpp -------------- #include #include int main() { std::string s1 = "Hej!"; std::cout << s1 << std::endl; std::string s2 = "Hopp!"; std::string s3; s3 = s1 + " " + s2; std::cout << s3 << std::endl; std::cout << s1 + " " + s2 << std::endl; } Utmatning från programmet ------------------------- Hej! Hej! Hopp! Hej! Hopp! dotnetstrings.cpp ----------------- #include "stdafx.h" #include int main() { System::String^ s1 = "Hej!"; System::Console::WriteLine(s1); System::String^ s2 = "Hopp!"; System::String^ s3; s3 = s1 + " " + s3; System::Console::WriteLine(s3); System::Console::WriteLine(s1 + L" " + s2); } Utmatning från programmet ------------------------- Hej! Hej! Hopp! Hej! Hopp!