Klasse aus Objekten anderer Klassen

Ich habe folgende Klasse für Messwerte:

DIe Header:
Code:
#ifndef MESSWERTE_H

#define MESSWERTE_H



class Messwerte    //nur ein Messwert

{

public:

    Messwerte();

    ~Messwerte();

    Messwerte(double neuWert = 0.0 , double neuXkoordinate = 0.0 , double neuYkoordinate=0.0);




    void setWert(double eingabeWert);

    double getWert() const;




    double getxKoordinate() const;

    void setxKoordinate(double eingabeXkoordinate);




    double getyKoordinate() const;

    void setyKoordinate(double eingabeYkoordinate);




    int getMessID() const;




private:  const int messwertID;

    double wert;

    double xKoordinate;

    double yKoordinate;

    static int anzahlMesswerte;


};


#endif // MESSWERTE_H

Die cpp:
Code:
#include "messwerte.h"

#include <iostream>




using namespace  std;



Messwerte::Messwerte(double neuWert , double neuXkoordinate , double neuYkoordinate)  // ALTERNATIVE SCHREIBWEISE FÜR DEN KOSTRUKTOR IN FORM EINER

    : messwertID(++anzahlMesswerte), wert(neuWert), xKoordinate(neuXkoordinate), yKoordinate(neuYkoordinate) {




}

Messwerte::~Messwerte() {

    anzahlMesswerte--;

}

double Messwerte::getWert() const {

    return wert;

}

void Messwerte::setWert(double eingabeWert) {

    wert = eingabeWert;

}

double Messwerte::getxKoordinate() const{

    return xKoordinate;

}

void Messwerte::setxKoordinate(double eingabeXkoordinate) {

    xKoordinate = eingabeXkoordinate;

}


double Messwerte::getyKoordinate() const{

    return yKoordinate;

}

void Messwerte::setyKoordinate(double eingabeYkoordinate) {

    xKoordinate = eingabeYkoordinate;

}

int Messwerte::getMessID() const
{
    return messwertID;
}
int Messwerte:: anzahlMesswerte = 0;

Es soll eine Klasse Datenbestand erstellt werden, die, wenn man ein Objekt Datenbestand d1 erstellt, ein leeres array (Messwerte liste[]) erstellt.

Ich hatte die Idee in den Konstruktor die Größe für das Array zu schreiben und mit diesem ein Array Messwerte liste[groesse] zu erstellen.

Code:
#ifndef DATENBESTAND_H

#define DATENBESTAND_H

#include "messwerte.h"


class Datenbestand

{

public:

    Datenbestand(int groesse);


private:


};


#endif // DATENBESTAND_H

Und die cpp:
Code:
#include "datenbestand.h"

#include "messwerte.h"




Datenbestand::Datenbestand(int groesse)

{

   Messwerte liste[groesse];

}
In der cpp wird mit liste rot angestrichen.
Weiß jemand wieso das so ist bzw. wie ich das Problem beheben könnte?
Gruß Max
 

cwriter

Erfahrenes Mitglied
C++:
Messwerte();
~Messwerte();

Messwerte(double neuWert = 0.0 , double neuXkoordinate = 0.0 , double neuYkoordinate=0.0);
Der Default-Konstruktor "Messwerte()" und "Messwerte(double ...)" sind nicht unterscheidbar.

In der cpp wird mit liste rot angestrichen.
Weiß jemand wieso das so ist bzw. wie ich das Problem beheben könnte?
Der Compiler gibt dir sicher auch einen Fehler als Text, oder?

C++:
Messwerte::~Messwerte() {
    anzahlMesswerte--;
}
Meinst du, dass das eine gute Idee ist? Überlege dir, wie die IDs verteilt werden, und ob die IDs eindeutig sein müssen.

Gruss
cwriter
 
So richtig schaffe ich es nicht.
Könntest du vielleicht verallgemeinert sagen wie man eine Klasse macht die Objekte einer anderen Klasse verwaltet?
Etwas hilfreiches dazu im Internet habe ich nicht gefunden.
 

Technipion

Erfahrenes Mitglied
So richtig schaffe ich es nicht.
Könntest du vielleicht verallgemeinert sagen wie man eine Klasse macht die Objekte einer anderen Klasse verwaltet?
Etwas hilfreiches dazu im Internet habe ich nicht gefunden.
Der Compiler gibt dir sicher auch einen Fehler als Text, oder?
cwriter hat dir doch schon etwas unheimlich hilfreiches gesagt. Wie lautet denn der Fehler, den der Compiler ausgibt?

Gruß Technipion
 
Der Compiler sagt constructor for 'Datenbestand' must explicitly initialize the member 'list' which does not have a default constructor.
dann habe ich einen default constructor in die Klasse Messwerte hinzugefügt:
Code:
Messwerte();
Messwerte::Messwerte() {}
Jetzt geh es!
Danke leute :D
 

cwriter

Erfahrenes Mitglied
Der Compiler sagt constructor for 'Datenbestand' must explicitly initialize the member 'list' which does not have a default constructor.
Nö, sagt er sicher nicht; jedenfalls nicht mit dem Code, den du uns gegeben hast. Dein Fehler bezieht sich auf so etwas:
C++:
class Datenbestand
{
public:
    // ...
    Messwerte list;
};
Messwerte(); Messwerte::Messwerte() {}
Der tut aber nicht, was du willst. Du hast ja schon einen Default-Constructor mit
C++:
Messwerte(double neuWert = 0.0 , double neuXkoordinate = 0.0 , double neuYkoordinate=0.0);
Dein neuer default-Constructor (den du übrigens mit weniger Code schreiben kannst) setzt keine Member auf 0, so wie es dein existierender Konstruktor tun würde.
C++:
class Messwerte
{
public:
    Messwerte() = default; // Kurz-syntax für default Constructor
};

Aber eigentlich sollte, wie gesagt, der Konstruktor mit den default-Argumenten als Default-Constructor hinhalten.

Das funktioniert bei mir tadellos.
C++:
class Test
{
public:
        Test(int x = 0)
        : m_x(x)
        {
        }
private:
        int m_x;
};


int main(int argc, char* argv[])
{
        Test t; // Default-Constructor call.
}

// Fehler mit Test() deklariert:
//test.cpp:16:7: error: call of overloaded ‘Test()’ is ambiguous
Wie gesagt hättest du auch einfach das "Messwerte();" (die Deklaration des Default-Constructors) löschen können.

Gruss
cwriter
 
Danke erstmal für deine ganze Hilfe!
Ich hab den Code nach meinem Post noch verändert, vielleicht könnte es daran liegen. Jetzt geht es aber und ich habe verstanden wo bzw. wieso das Problem aufgetreten ist.
Gruß
Max
 

Neue Beiträge