Eigenen Datentyp?



  • new int[N]()

    Steckt da noch mehr dahinter?
    Kann das syntaktisch noch anders aussehen?
    Wie heißt das Konstrukt?

    Mir wars auch völlig unbekannt.


  • Mod

    Alle Zitate aus C++98, in C++11 sind die Formulierungen etwas anders, aber laufen auf das gleiche hinaus. Hervorhebung durch mich:

    5.3.4/1:

    new-expression:
    ::opt new new-placementopt new-type-id new-initializeropt

    ...

    new-initializer:
    ( expression-listopt] )

    Man beschte, die expression-list ist optional!

    5.3.4/15:

    A new-expression that creates an object of type T initializes that object as follows:
    ...
    — If the new-initializer is of the form (), default-initialization shall be performed (8.5);

    8.5/5:

    To default-initialize an object of type T means:
    — if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
    ill-formed if T has no accessible default constructor);
    — if T is an array type, each element is default-initialized;
    — otherwise, the storage for the object is zero-initialized.

    8.5/5:

    To zero-initialize storage for an object of type T means:
    — if T is a scalar type (3.9), the storage is set to the value of 0 (zero) converted to T;
    — if T is a non-union class type, the storage for each nonstatic data member and each base-class subobject
    is zero-initialized;
    — if T is a union type, the storage for its first data member89) is zero-initialized;
    — if T is an array type, the storage for each element is zero-initialized;
    — if T is a reference type, no initialization is performed.

    3.9/10:

    Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to member types (3.9.2), and cv-
    qualified versions of these types (3.9.3) are collectively called scalar types.

    3.9.1/10:

    Integral and floating types are collectively
    called arithmetic types.

    3.9.1/7:

    Types bool, char, wchar_t, and the signed and unsigned integer types are collectively called integral types.

    3.9.1/2:

    There are four signed integer types: “signed char”, “short int”, “int”, and “long int.” In this
    list, each type provides at least as much storage as those preceding it in the list.

    Puh! Und damit folgt mit meiner obigen Erklärung, dass new int[N]() ein Array mit N ints erzeugt und die auch wirklich garantiert alle 0 sind. Was passiert, wenn man da was anderes hinschreibt, möge man sich selber erarbeiten. Die relevanten Stellen habe ich ja angegeben.



  • Interessant.
    Danke für die Mühe 👍



  • SeppJ schrieb:

    3.9.1/2:

    There are four signed integer types: “signed char”, “short int”, “int”, and “long int.” In this
    list, each type provides at least as much storage as those preceding it in the list.

    `

    long long int` ist sein C++11 standardisiert.


  • Mod

    Hacker schrieb:

    `

    long long int` ist sein C++11 standardisiert.

    Schon komisch, dass der

    SeppJ schrieb:

    C++98

    Standard das nicht weiß 🙄



  • SeppJ schrieb:

    Hacker schrieb:

    `

    long long int` ist sein C++11 standardisiert.

    Schon komisch, dass der

    SeppJ schrieb:

    C++98

    Standard das nicht weiß 🙄

    Ich les mal wieder zu wenig 😃
    Aber long long gab es doch schon seit C++98?



  • Nein. Viele (so gut wie alle) Compiler haben es als Erweiterung angeboten, aber Standard war es vor C++11 nicht.



  • SeppJ schrieb:

    Hacker schrieb:

    `

    long long int` ist sein C++11 standardisiert.

    Schon komisch, dass der

    SeppJ schrieb:

    C++98

    Standard das nicht weiß 🙄

    ich wette, da gibt es noch mehr Dinge im C++11 Standard, die der 98er Standard noch nicht kennt 😉



  • daddy_felix schrieb:

    SeppJ schrieb:

    Hacker schrieb:

    `

    long long int` ist sein C++11 standardisiert.

    Schon komisch, dass der

    SeppJ schrieb:

    C++98

    Standard das nicht weiß 🙄

    ich wette, da gibt es noch mehr Dinge im C++11 Standard, die der 98er Standard noch nicht kennt 😉

    Ich wette dagegen. Denn der C++11 Standard beinhaltet so ungefähr alles, was der C++98 auch beinhaltet (bis auf die Sachen die syntaktisch verändert wurden). int beinhalten auch beide.

    Und das "noch" kannst du wegmachen, wieso noch?



  • Der C++98 Standard hatte 715 Seiten, C++11 hat 1310. Nur mal so als Einwurf.



  • 314159265358979 schrieb:

    Der C++98 Standard hatte 715 Seiten, C++11 hat 1310. Nur mal so als Einwurf.

    Das gibts ja garnich' 😮
    So viel neues?



  • 314159265358979 schrieb:

    Der C++98 Standard hatte 715 Seiten, C++11 hat 1310. Nur mal so als Einwurf.

    Hab die das http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#334 angehangen?



  • Hacker schrieb:

    daddy_felix schrieb:

    ich wette, da gibt es noch mehr Dinge im C++11 Standard, die der 98er Standard noch nicht kennt 😉

    Ich wette dagegen. Denn der C++11 Standard beinhaltet so ungefähr alles, was der C++98 auch beinhaltet (bis auf die Sachen die syntaktisch verändert wurden). int beinhalten auch beide.

    Und das "noch" kannst du wegmachen, wieso noch?

    ➡

    Hacker schrieb:

    Ich les mal wieder zu wenig 😃



  • Michael E. schrieb:

    Hacker schrieb:

    daddy_felix schrieb:

    ich wette, da gibt es noch mehr Dinge im C++11 Standard, die der 98er Standard noch nicht kennt 😉

    Ich wette dagegen. Denn der C++11 Standard beinhaltet so ungefähr alles, was der C++98 auch beinhaltet (bis auf die Sachen die syntaktisch verändert wurden). int beinhalten auch beide.

    Und das "noch" kannst du wegmachen, wieso noch?

    ➡

    Hacker schrieb:

    Ich les mal wieder zu wenig 😃

    Stop. Wieso? Der C++11-Standard behält doch viel vom alten. Außerdem werd' ich doch nicht wie camper den ganzen Standard lesen.



  • Hi Leute!

    Ich hab nun den code von gestern noch ein bisschen verbessert. Leider geht er aber nicht. Ich weiß aber auch nicht wo der Fehler ist, da die Fehler die er ausspuckt, ich noch nie gelesen habe:

    Fehler 4 error LNK1120: 2 nicht aufgelöste externe Verweise. C:\Users\Tobias Mehrl\Desktop\U1Aufgabe1\Debug\U1Aufgabe1.exe 1
    Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall meinDatentyp::~meinDatentyp(void)" (??1meinDatentyp@@QAE@XZ)" in Funktion "_main". C:\Users\Tobias Mehrl\Desktop\U1Aufgabe1\U1Aufgabe1\U1Aufgabe1.obj
    Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall meinDatentyp::meinDatentyp(int)" (??0meinDatentyp@@QAE@H@Z)" in Funktion "_main". C:\Users\Tobias Mehrl\Desktop\U1Aufgabe1\U1Aufgabe1\U1Aufgabe1.obj

    Hier der neue Code:

    #include<iostream>
    #include<ctime>
    using namespace std;
    
    class meinDatentyp
    {
    private:
    	int n;
    	int *feld;
    
    public:
    	meinDatentyp(int n);
    	~meinDatentyp();
    
    	void init(int n);
    	void print();
    	void fillRandom();
    	void min();
    };
    
    void meinDatentyp::init(int n)
    {
    	feld = new int [n];
    
    	for(int i=0; i<n; i++)
    	{
    		feld[i] = 0;
    	}
    }
    
    void meinDatentyp::print()
    {
    	for(int i=0; i<n; i++)
    	{
    		cout << feld[i];
    		cout << endl;
    	}
    }
    
    void meinDatentyp::fillRandom()
    {
    	srand(time(0));
    
    	for(int i=0; i<n; i++)
    	{
    		feld[i] = (rand() % 100);
    	}
    }
    
    void meinDatentyp::min()
    {
    	int ergebnis = 0;
    	float mittelwert = 0;
    	for(int i=0; i<n; i++)
    	{
    		ergebnis = ergebnis + feld[i];
    	}
    
    	cout << "Mittelwert = " << (float)ergebnis / n;
    }
    
    int main()
    {
    	meinDatentyp a(5);
    
    	a.init(5);
    	a.fillRandom();
    	a.print();
    	a.min();
    
    system("pause");
    return 0;
    }
    

    Könnt ihr mir helfen?



  • 1. Kein return 0;
    2. Kein system("pause");
    3. Du hast den Destruktor nicht definiert -> lösch die " ~meinDatentyp(); " Zeile wenn er sowieso trivial sein soll
    4. Den Konstruktor hast du ebenso wenig definiert -> änder in Zeile 24

    void meinDatentyp::init(int n)
    

    zu

    void meinDatentyp::meinDatentyp(int n)
    

    Soviel erstmal.
    Bitte Initialisierungs-listen verwenden:

    void meinDatentyp::meinDatentyp(int n):
    feld( new int[n]() )
    {
    }
    

    Mit dem () nach den Indiz-Klammern wird automatisch alles mit 0 initialisiert.

    void meinDatentyp::min()
    {
        int ergebnis = 0;
        float mittelwert = 0;//wird nicht verwendet (sollte warnungen geben)
        for(int i(0); i < n; i++)
            ergebnis = ergebnis + feld[i];
    
        std::cout << "Mittelwert = " << static_cast<float>(ergebnis) / n; // C++-Casts
    }
    

    NIE using namespace ...; in Headern!

    srand(...) muss in die main() (wird nur einmal ausgeführt)



  • Hacker schrieb:

    1. Kein return 0;

    Was habt ihr eigentlich immer an return 0 zu meckern?



  • Gugelmoser schrieb:

    Hacker schrieb:

    1. Kein return 0;

    Was habt ihr eigentlich immer an return 0 zu meckern?

    Es ist unnötig!
    😃

    Ach ja! Ein Sache vergessen, du musst natürlich auch die init() Deklaration in der Klasse löschen, damit es keine Linkerfehler gibt.



  • Hacker schrieb:

    Gugelmoser schrieb:

    Hacker schrieb:

    1. Kein return 0;

    Was habt ihr eigentlich immer an return 0 zu meckern?

    Es ist unnötig!
    😃

    Ach ja! Ein Sache vergessen, du musst natürlich auch die init() Deklaration in der Klasse löschen, damit es keine Linkerfehler gibt.

    Ich finds inkonsistent.



  • Gugelmoser schrieb:

    Hacker schrieb:

    Gugelmoser schrieb:

    Hacker schrieb:

    1. Kein return 0;

    Was habt ihr eigentlich immer an return 0 zu meckern?

    Es ist unnötig!
    😃

    Ach ja! Ein Sache vergessen, du musst natürlich auch die init() Deklaration in der Klasse löschen, damit es keine Linkerfehler gibt.

    Ich finds inkonsistent.

    Quatsch, es erleichtert allen Pro's das Lesen. return 0; suggeriert, dass uns der Rückgabewert von main() (gerade in diesem Fall) interessiert. Tut er aber nicht! Also kein return; .


Anmelden zum Antworten