Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

06.07.2014, 13:22

C++ Pitfalls: Wer findet die Fehler?

Wie viele Fehler findest du?

Insgesamt 13 Stimmen

69%

Das gesamte Programm ist ein einziger großer Fehler (9)

15%

2 Fehler (2)

8%

1 Fehler (1)

8%

4 Fehler (1)

8%

5 Fehler (1)

8%

6 Fehler (1)

0%

3 Fehler

Ich habe gerade mal aus Langeweile an ein paar Fallen in C++ gedacht und ein kleines (mit Absicht schlechtes ^^) C++ Beispiel geschrieben.
Findet ihr alle (Syntax, Kontext und Logik) Fehler?

C-/C++-Quelltext

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <string>
#include <iostream>

using namespace std;

// Vehicle base class
class Vehicle {
    public:
        Vehicle() {
            // Print information about this vehicle at initialization time
            cout << Info() << endl;
        }
        virtual string Info() {
            // Return empty string per default
            return "";
        }
};

// Car class implements "Vehicle" interface
class Car : public Vehicle {
    public:
        Car(int numWheels, int wheelPressure) {
            numWheels_ = numWheels;
            
            // Allocate array
            wheelPressures_ = new int[numWheels_];
            
            // Initialize array
            for (int i = 0; i < numWheels_; i++) {
                wheelPressures_[i] = wheelPressure;
            }
        }
        ~Car() {
            // Delete array
            delete [] wheelPressures_;
        }
        // Override information function
        string Info() {
            // Return car information
            return "Car: number of wheels = " + numWheels_;
        }
    private:
        int* wheelPressures_;
        int numWheels_;
};

// Entry point
int main() {
    // Allocate a new vehicle
    Vehicle* myVehicle = new Car(4, 3);
    
    // Print vehicle information
    cout << myVehicle.Info() << endl;
    
    // Delete vehicle
    delete myVehicle;
    
    return 0;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

06.07.2014, 13:29

Das ist diskutabel. Ist die Nicht-Verwendung von Smart-Pointern ein Fehler? Ist Aufruf einer virtuellen Methode im Konstruktor ein Fehler? Ist die Neudeklaration einer Methode, die in der Oberklasse virtual ist ein Fehler? Ist die Nicht-Verwendung von Initializern im Konstruktor ein Fehler? Auf die anderen offensichtlichen und syntaktischen Fehler gehen ich mal nicht ein, das darf jeder für sich selbst üben. :)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

06.07.2014, 13:29

Fehler 1: Aufruf einer virtuellen Methode innerhalb eines Konstruktors.
Der Rest hat eher mit schlechtem Stil, als mit "Fehlern" zutun.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

06.07.2014, 13:32

Dummheit, aber kein Fehler: new[] anstatt einem std::vector.

Und Membervars mit Unterstrichen am Ende zu schreiben... uff... hoffentlich programmierst Du intern nicht wirklich so und das war nur eine Demo hier.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

06.07.2014, 13:47

hoffentlich programmierst Du intern nicht wirklich so und das war nur eine Demo hier.

Wie gesagt, es war mal ein absichtlich schlechtes Beispiel ;-)

Zitat von »Schrompf«

Und Membervars mit Unterstrichen am Ende zu schreiben...

Das kann man wohl kaum einen Fehler nennen. Ich kenne drei Konventionen zu member Variablen:

C-/C++-Quelltext

1
2
3
int m_member; // Variante 1
int member_; // Variante 2
int member; // Variante 3

Ich mache das halt wie in der 2. Variante. Was soll falsch daran sein?

Zitat von »BlueCobol«

Ist die Nicht-Verwendung von Smart-Pointern ein Fehler

In diesem Beispiel ging es mir jetzt eher weniger um 'Fehler' wie nicht C++11 oder nicht Boost zu verwenden.
Aber wenn man ein paar Fallen einbauen will, kann man eben keinen sauberen C++11 Code schreiben ^^

idontknow

unregistriert

6

06.07.2014, 14:52

Fehler 1: Aufruf einer virtuellen Methode innerhalb eines Konstruktors.
Der Rest hat eher mit schlechtem Stil, als mit "Fehlern" zutun.

Ist das wirklich ein Fehler? (bei pure virtual hätte ich dir zugestimmt, bei nur virtual bin ich mir nicht sicher.)

Ansonten: Der Info Text wird 2x ausgeben, man könnte das als Fehler werten da Ausgabe nicht von Logik getrennt ist sondern eher bisschen gemixt.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

06.07.2014, 14:55

Ich hab ne Weile lang Funktionsparameter so geschrieben_

Hat zu ner Reihe hässlicher Fehler geführt, weil man die halt schnell übersieht. Seitdem habe ich dazugelernt und schreibe jetzt mMember und pParameter.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

06.07.2014, 15:00

Fehler 1: Aufruf einer virtuellen Methode innerhalb eines Konstruktors.
Der Rest hat eher mit schlechtem Stil, als mit "Fehlern" zutun.

Ist das wirklich ein Fehler? (bei pure virtual hätte ich dir zugestimmt, bei nur virtual bin ich mir nicht sicher.)

Man kann nicht wissen, ob in der virtuellen Methode Member verwendet werden, die noch nicht initialisiert wurden. In dem Beispiel wird numWheels_ vor seiner Initialisierung verwendet -> undefiniertes Verhalten.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

idontknow

unregistriert

9

06.07.2014, 15:00

Die Info Method der Car Klasse is auch Müll, aber sollen wir die Fehler überhaupt spoilern?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

06.07.2014, 15:03

Ja, das ist ein fieser Fehler. In den meisten anderen Sprachen ist das kein Problem, weshalb ihn wohl viele übersehen haben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige

Ähnliche Themen