Geachte dames en heren, welkom in mijn topic. 
Ik ben sinds een weekje bezig om wat praktijk-ervaring optedoen met betrekking tot C++ en OOP.
Ik heb een aantal vragen. Ik hoop dat jullie ze kunnen en willen beantwoorden.
Ik gebruik trouwens de Mingw32-compiler icm Dev-C++ 4.
de this pointer binnen classes:
In de meeste gevallen mag binnen een class de "this pointer" weggelaten worden.
Wat is hier de reden voor?
In welke gevallen is het niet toegestaan?
Wat vinden jullie hier zelf van?
constructor-overloading + inheritance:
In voorbeeld 1 erft de Derived-class automatisch de constructor van de Base-class. Bij het instantieren van de Derived-class wordt dus autoamatisch het getal 10 toegekent aan de variabele test.
In voorbeeld 2 wil ik die constructor overloaden in de Derived-class. Dat werkt echter niet. Ik krijg een error: "no matching function for call to 'Derived::Derived()' candidates are bla bla".
Ik heb toen het volgende toegevoegt aan de Derived-class:
Als ik
Waarom werkt voorbeeld 2 niet en waarom geeft voorbeeld 3 een link-error?
voorbeeld 1:
voorbeeld 2:
voorbeeld 3:
swap functie:
Na een kleine zoektocht kwam ik terecht bij het begrip "pass-by-reference". Ik kreeg daarbij 2 voorbeelden voorgeschoteld. Men zij dat voorbeeld 1 netter is, omdat voorbeeld 2 problemen kon veroorzaken. Er werd echter niet uigelegd wat die problemen zijn. Kunnen jullie mij dat uitleggen?
voorbeeld 1:
voorbeeld 2:
pointers:
Ik gebruik structs als containers voor punten. Deze punten gebruik ik weer in andere classes om mee te rekenen. Er zijn 3 mogelijkheden die werken. Ikzelf gebruik pointers (voorbeeld 1), maar ik vraag mij af wat daar het voordeel van is. Ik heb niet zoveel ervaring met het gebruik van pointers. Wat geniet jullie voorkeur en waarom?
voorbeeld 1 (pointers):
voorbeeld 2 (lokale variabeles):
voorbeeld 3 (references):
Ik ben sinds een weekje bezig om wat praktijk-ervaring optedoen met betrekking tot C++ en OOP.
Ik heb een aantal vragen. Ik hoop dat jullie ze kunnen en willen beantwoorden.
Ik gebruik trouwens de Mingw32-compiler icm Dev-C++ 4.
de this pointer binnen classes:
In de meeste gevallen mag binnen een class de "this pointer" weggelaten worden.
Wat is hier de reden voor?
In welke gevallen is het niet toegestaan?
Wat vinden jullie hier zelf van?
constructor-overloading + inheritance:
In voorbeeld 1 erft de Derived-class automatisch de constructor van de Base-class. Bij het instantieren van de Derived-class wordt dus autoamatisch het getal 10 toegekent aan de variabele test.
In voorbeeld 2 wil ik die constructor overloaden in de Derived-class. Dat werkt echter niet. Ik krijg een error: "no matching function for call to 'Derived::Derived()' candidates are bla bla".
Ik heb toen het volgende toegevoegt aan de Derived-class:
code:
. Dat werkt echter niet en ik krijg een link-error: "undefined reference to 'Derived::Derived(void)'".1
| Derived(); |
Als ik
code:
toevoeg dan werkt het wel.1
| Derived(){} |
Waarom werkt voorbeeld 2 niet en waarom geeft voorbeeld 3 een link-error?
voorbeeld 1:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| class Base { public: Base() { test = 10; } protected: int test; }; class Derived : public Base { public: int getTest() { return test; } }; int main() { Derived bloeb; std::cout << bloeb.getTest() << std::endl; // geeft 10 weer return 0; } |
voorbeeld 2:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| class Base { public: Base() { test = 10; } protected: int test; }; class Derived : public Base { public: Derived(int i) { test = i; } int getTest() { return test; } }; int main(){ Derived bloeb; // no matching function for call to 'Derived::Derived()' std::cout << bloeb.getTest() << std::endl; return 0; } |
voorbeeld 3:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| class Base { public: Base() { test = 10; } protected: int test; }; class Derived : public Base { public: Derived(){} // Als ik deze regel toevoeg werkt het wel Derived(int i) { test = i; } int getTest() { return test; } }; int main() { Derived bloeb; // werkt std::cout << bloeb.getTest() << std::endl; // geeft 10 weer. return 0; } |
swap functie:
Na een kleine zoektocht kwam ik terecht bij het begrip "pass-by-reference". Ik kreeg daarbij 2 voorbeelden voorgeschoteld. Men zij dat voorbeeld 1 netter is, omdat voorbeeld 2 problemen kon veroorzaken. Er werd echter niet uigelegd wat die problemen zijn. Kunnen jullie mij dat uitleggen?
voorbeeld 1:
C++:
1
2
3
4
5
| void swap(int &a, int &b) { int temp = a; a = b; b = temp; } |
voorbeeld 2:
C++:
1
2
3
4
5
| void swap(int &a, int &b) { a = a+b; b = a-b; a = a-b; } |
pointers:
Ik gebruik structs als containers voor punten. Deze punten gebruik ik weer in andere classes om mee te rekenen. Er zijn 3 mogelijkheden die werken. Ikzelf gebruik pointers (voorbeeld 1), maar ik vraag mij af wat daar het voordeel van is. Ik heb niet zoveel ervaring met het gebruik van pointers. Wat geniet jullie voorkeur en waarom?
offtopic:
Ik begrijp dat ik in mijn voorbeelden de constructor een beetje misbruik.
Ik begrijp dat ik in mijn voorbeelden de constructor een beetje misbruik.
voorbeeld 1 (pointers):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| struct Point2D { float x; float y; }; class qbc { public: qbc(Point2D *a, Point2D *b) { std::cout << "x: " << this->midpoint(a,b).x << std::endl; std::cout << "y: " << this->midpoint(a,b).y << std::endl; } Point2D midpoint(Point2D *a, Point2D *b) { Point2D point; point.x = (a->x+b->x)/2; point.y = (a->y+b->y)/2; return point; } }; int main() { Point2D punt1 = {20,20}; Point2D punt2 = {300,200}; qbc bloeb(&punt1,&punt2); system("PAUSE"); return 0; } |
voorbeeld 2 (lokale variabeles):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| struct Point2D { float x; float y; }; class qbc { public: qbc(Point2D a, Point2D b) { std::cout << "x: " << this->midpoint(a,b).x << std::endl; std::cout << "y: " << this->midpoint(a,b).y << std::endl; } Point2D midpoint(Point2D a, Point2D b) { Point2D point; point.x = (a.x+b.x)/2; point.y = (a.y+b.y)/2; return point; } }; int main() { Point2D punt1 = {20,20}; Point2D punt2 = {300,200}; qbc bloeb(punt1,punt2); system("PAUSE"); return 0; } |
voorbeeld 3 (references):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| struct Point2D { float x; float y; }; class qbc { public: qbc(Point2D &a, Point2D &b) { std::cout << "x: " << this->midpoint(a,b).x << std::endl; std::cout << "y: " << this->midpoint(a,b).y << std::endl; } Point2D midpoint(Point2D &a, Point2D &b) { Point2D point; point.x = (a.x+b.x)/2; point.y = (a.y+b.y)/2; return point; } }; int main() { Point2D punt1 = {20,20}; Point2D punt2 = {300,200}; qbc bloeb(punt1,punt2); system("PAUSE"); return 0; } |
PC load letter? What the fuck does that mean?