webForumDet fria alternativet

konstruktör-problem

2 svar · 226 visningar · startad av jme

jmeMedlem sedan maj 20011 967 inlägg
#1

Hej!

Efter några års inaktivitet på C++ fronten så tänkte jag putsa upp mina kunskaper...

Efter lite pillande så märkte jag att

// Test.h

#ifndef _TEST_H_
#define _TEST_H_

class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h = 0, int m = 0);
void AddMin(int m);
void AddHr(int h);
void Reset(int h = 0, int m = 0);
Time operator+(const Time & t) const;
void Show() const;
};

#endif

När jag försöker kompilera koden så får jag bl a följande fel:

....\test.h(19) : warning C4520: 'Time' : multiple default constructors specified

Och vad jag vet så är

Time(); en default constructor
Time(int h = 0, int m = 0); är en annan konstruktör

Om jag kommenterar den första konstruktören så fungerar koden.

i main() så använder jag följande:

Time A; // använder default constructor?
Time B(2, 50); // använder den konstruktör som jag har gjort

Time A;

är väl samma sak som

Time A = Time(); ?

Varför kan jag då inte skapa en Time() konstruktör?

Marcus EMedlem sedan maj 20021 294 inlägg
#2

När du anger utelämningsvärden för samtliga argument innebär det att samtliga argument kan utelämnas vid anropet.

Time(int h = 0, int m = 0)
kan anropas med både Time(värde1, värde2), Time(värde1) och Time(). Den sistnämnda har samma utformning som en utelämningskonstruktör (default constructor). Därför vet inte kompilatorn vilken av funktionerna som ska anropas när du utelämnar konstruktören, därav felmeddelandet.

jmeMedlem sedan maj 20011 967 inlägg
#3

Tack för det snabba svaret. Dock han jag rådfråga en kompis som gav samma svar, innan jag läste svaret här.

Exemplet jag försökte köra var tagen ur en bok. Blind som jag är så såg jag inte den lilla skillnaden... Att den första argumentet inte var int h = 0 utan int h

Genererad på 374 ms · cache AV · v20260730165559-full.f96bc7eb