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.
-
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.
-
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
Aberlong 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.objHier 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. Keinsystem("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 24void 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 diemain()
(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 vonmain()
(gerade in diesem Fall) interessiert. Tut er aber nicht! Also keinreturn;
.