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

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

04.06.2016, 12:30

C++ operator>> überladen

Hi,
wie kann man den Eingabe Operator in C++ am besten überladen?

Mein Code kann in dieser Variante nicht auf die private Attribute der Klasse zugreifen.

Vektor.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef VEKTOR
#define VEKTOR

class VEKTOR
{
public:
    VEKTOR(int);
    VEKTOR();

    friend istream& operator>>(istream&, Vektor&);
    friend ostream& operator<<(ostream&, const Vektor&);

private:
    int dimension
    double* komponenten
};

#endif // !VEKTOR


Vektor.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Vektor.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

istream& operator>>(istream& input, CVektorDbl& vektor)
{
    for (int i = 0; i < vektor.dim; i++) //Fehler: vektor.dim nicht zugreifbar
    {
        cin >> vektor.pKomp[i]; //Fehler: vektor.pKomp[] nicht zugreifbar
    }

    return input;
}

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

2

04.06.2016, 13:15

.., weil die Signaturen nicht passen.

C-/C++-Quelltext

1
istream& operator>>(istream&, Vektor&);

C-/C++-Quelltext

1
istream& operator>>(istream& input, CVektorDbl& vektor)

3

04.06.2016, 13:18

In deinem Code gibt es VEKTOR (der wegen des #defines am Ende überhaupt keinen Namen hat, weil es durch nichts ersetzt wurde), Vektor ubd CVektorDbl. Was jetzt?
Im Übrigen rate ich dir zu Templates, dann kannst du den unterliegenden Typen der Komponenten des Vektors bestimmen, als auch die Dimension, und das zu Compilierzeit. Schließlich expandiert so ein Vektor ja nicht im Laufe des Programms.
Das C-Präfix und deutsche Namens sind auch sowas von out.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

4

04.06.2016, 15:45

@CentuCore
War ein Tippfehler von mir, in VS sind die Klassennamen identisch. Die Klasse heißt nicht Vektor, sondern CVektorDbl, wollte das nur für den Beitrag ändern, da die Studienarbeit die selben Bezeichnungen verwendet und diese Seite durch Google findbar ist, naja :rolleyes:

@Techel
Das wurde von unserem Professor als Grundgerüst für .h Dateien empfohlen, damit diese nur ein mal in den Programm Code kopiert werden, auch wenn sie von mehreren Dateien verwendet wird. Es müsste auch ohne einen Wert nach #define VEKTOR funktionieren, ich will damit ja nichts austauschen, sondern nur schauen, ob die Definition existiert.
Ach ja, zur Namensgebung von Attributen und Klassennamen, die wurden vom Professor vorgegeben. Kann sein, dass die Aufgaben schon ein paar Jahre (Jahrzehnte ^^ ) alt sind, aber da es so gelehrt wird und der Code bewertet wird, will ich mich an das Schema halten.
Bei freizeit und beruflichen Projekten, würde ich auch besser eine andere Namensgebung verwenden.

C-/C++-Quelltext

1
2
3
4
5
6
#ifndef VEKTOR
#define VEKTOR

//Definition der Klasse

#endif // !VEKTOR

Gibt auch einen Stackoverflow Beitrag dazu.

Die Definitionen der Methoden sind in der .h und .cpp Datei identisch, bis auf das friend Attribut, welches nur in der .h Datei steht. Habt ihr Ideen, was noch Fehlerquellen sein könnten?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (04.06.2016, 15:51)


5

04.06.2016, 18:20

Es müsste auch ohne einen Wert nach #define VEKTOR funktionieren, ich will damit ja nichts austauschen, sondern nur schauen, ob die Definition existiert.


Ich glaube Techel meint das etwas anders, da #define in der Regel eine Ersetzung zur Folge hat und deine Klasse genau so wie das define heist, würde der Klassenname class VECTOR Theoretisch zu class (Kein Name mehr).

Allerdings weiß ich nicht ob da das #ifndef vor her noch irgendwelche auswirkung hat.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.06.2016, 18:29

Ist zumindest keine tolle Idee. Warum gibst du der Klasse einen Namen mit nur Großbuchstaben?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

04.06.2016, 19:16

Ist auch einer der Gründe warum man gern #DEFINE HEADERNAME_H oder #DEFINE HEADERNAME_HPP benutzt und nicht einfach nur einen Namen.
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]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

04.06.2016, 19:35

Ich arbeite mit #pragma once. Das wird mittlerweile von so vielen Compilern unterstützt und ist nicht nur weniger fehleranfällig als Include-Guards sondern wird teilweise schneller vom Compiler verarbeitet.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

04.06.2016, 20:35

Ich verwend sowohl Include-Guards als auch #pragma once, da ich es gerne so halte, dass mein Code soweit als möglich unabhängig von optionalen Compilerfeatures korrekt ist (ein standardkonformer C++ Compiler darf ein #pragma once einfach so ignorieren):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#ifndef INCLUDED_MY_HEADER
#define INCLUDED_MY_HEADER

#pragma once


// ...

#endif  // INCLUDED_MY_HEADER


Damit hast du das Beste aus beiden Welten: Der Code ist nicht abhängig davon, dass der Compiler #pragma once supported, wenn dieser das aber tut, kommst du in den Genuss der entsprechenden Vorteile (selbst der Fall, dass der Compiler Include-Guard-Detection macht, aber #pragma once nicht kennt, sollte bei dieser Variante abgedeckt sein). Include-Guards bekommen bei mir das INCLUDED_ Präfix. Das minimiert nicht nur das Potential zu Namenskonflikten und beugt damit Problemen wie im obigen Beispiel mit VEKTOR vor, sondern vermeidet insbesondere auch, dass IntelliSense mich ständig mit uninteressanten Makronamen zuspammen muss...

Was Namensschemen für Include-Guards betrifft, sollte man an dieser Stelle evtl. erwähnen, dass man recht oft Dinge wie z.B. __MY_HEADER_H__ sieht. Leider ist es offenbar sogar so, dass einige, recht populäre C++ IDEs standardmäßig Include-Guards dieser Form automatisch generieren (man kann wohl hoffen, dass dies in den meisten solchen IDEs mittlerweile gefixed wurde). Das Problem dabei ist, dass sowohl Namen, die mit einem Underscore gefolgt von einem Großbuchstaben beginnen, als auch Namen, die einen doppelten Underscore enthalten, reservierte Namen sind und in einem standardkonformen C++ Programm eigentlich nicht verwendet werden dürfen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (04.06.2016, 20:44)


MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

10

04.06.2016, 20:36

Hab es ausgebessert. Ideen warum ich nicht auf die private Attribute in der operator>> Funktion zugreifen kann?

CVektorDbl.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef CVEKTORDBL_H
#define CVEKTORDBL_H

class CVektorDbl
{
public:
    CVektorDbl(int);
    ~CVektorDbl();

    //...

    friend istream& operator>>(istream&, CVektorDbl&);
    friend ostream& operator<<(ostream&, const CVektorDbl&);

private:
    int dim;
    double* pKomp;
};

#endif // !CVEKTORDBL_H


CVektorDbl.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//...
istream& operator>>(istream& input, CVektorDbl& vektor)
{
    for (int i = 0; i < vektor.dim; i++) //Fehler: vektor.dim
    {
        cin >> vektor.pKomp[i]; //Fehler: vektor.pKomp[]
    }

    return input;
}

Werbeanzeige