Defaultwerte in Konstruktoren?

03/04/2014 - 14:53 von Jörg Yadgar Bleimann | Report spam
Hi(gh)!

Hi(gh)!

Folgendes Problem: ich habe eine (im Moment noch ziemlich rudimentàre)
Klasse für SVG-Rechteckobjekte programmiert; weil in SVG die Attribute x
und y (Koordinaten der linken oberen Ecke) standardmàßig auf 0 gesetzt
sind, wollte ich dieses Verhalten in C++ nachbilden und habe den
Konstruktor entsprechend programmiert:

class SVG_rectangle
{
unsigned int startx;
unsigned int starty;
unsigned int width;
unsigned int height;
public:
SVG_rectangle(unsigned int=0, unsigned int=0, unsigned int, unsigned
int);
};

SVG_rectangle::SVG_rectangle(unsigned int x, unsigned int y, unsigned
int w, unsigned int h)
{
startx = x;
starty = y;
width = w;
height = h;
}

int main(int paramn, char* params[])
{
SVG_rectangle rec_01(100, 100);
SVG_rectangle rec_02(40, 20, 150, 75);

Leider funktioniert das nicht, ich bekomme folgende Fehlermeldung:

yadgar@debian:/media/Raytracing/Povscn/Flags/Coats of Arms$ g++
-std=c++11 flagmaker.cc -o flagmaker
flagmaker.cc:31:3: error: default argument missing for parameter 3 of
‘SVG_rectangle::SVG_rectangle(unsigned int, unsigned int, unsigned int,
unsigned int)’
flagmaker.cc:31:3: error: default argument missing for parameter 4 of
‘SVG_rectangle::SVG_rectangle(unsigned int, unsigned int, unsigned int,
unsigned int)’

- obwohl laut SCHADER, KUHLINS: Programmieren in C++, Springer 1993, S.
201-203 Konstruktoren durchaus so formuliert werden dürfen! Könnte es
daran liegen, dass im C++11-Standard nur noch entweder gar keine oder
alle Übergabevariablen Defaultwerte haben können? Wenn ich für w und h
ebenfalls Defaultwerte einsetze, funktioniert es nàmlich wieder...

Bis bald im Khyberspace!

Yadgar
10 PRINT"AFGHANISTAN GRUESST DEN REST DER WELT!"
20 GOTO 10

RUN
 

Lesen sie die antworten

#1 Alexander Wolf
03/04/2014 - 20:45 | Warnen spam
On 2014-04-03, Jörg 'Yadgar' Bleimann wrote:
[...]

#include <cstdlib>
class SVG_rectangle
{
unsigned int startx;
unsigned int starty;
unsigned int width;
unsigned int height;
public:
SVG_rectangle(unsigned int w, unsigned int h, unsigned int x=0, unsigned int y=0);
};

SVG_rectangle::SVG_rectangle(unsigned int w, unsigned int h, unsigned int x, unsigned int y) : startx(x), starty(y), width(w), height(h)
{ }

int main(int paramn, char* params[])
{
SVG_rectangle rec_01(100, 100);
SVG_rectangle rec_02(40, 20, 150, 75);

return EXIT_SUCCESS;
}

Die Reihenfolge ist signifikant. Zuerst die Parameter die immer initialisert
werden müssen und dann die Parameter mit default Werten.


HTH,
Alex
Man wird am ehesten betrogen, wenn man sich für klüger als die anderen hàlt.

Ähnliche fragen