Class errors

I am getting some constructor errors and an ambiguous call here overload function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <iostream>
using namespace std;
#include "Header.h"
#include <string>

int main() {


	
	clockType timeIn[5];
	print(timeIn);
	fill(timeIn);
	timeIn[0].incrementHours();
	print(timeIn);
	cout << endl;
	return 0;

	

	return 0;
}
///////////////
 #pragma once
class clockType {
public:		//access specifier 
	void setTime(int, int, int);	// make functions public to access private var's
	void getTime(int&, int&, int&) const;
	void print() const;
	void incrementSeconds();
	void incrementMinutes();
	void incrementHours();
	bool equalTime(const clockType&) const;
	clockType();
	clockType(int = 0, int = 0, int = 0);

	
private:				// by default all members are private
	int hr;
	int min;
	int sec;

};
void print(clockType in[])
{
	for (int i = 0; i < 5; i++)
	{
		cout << "Employee " << i + 1 << " clock in time = ";
		in[i].print();
		cout << endl;
	}
}

void fill(clockType in[])
{
	int h, m, s;
	for (int i = 0; i < 5; i++) {
		in[i].setTime(h,m,s);
		cout << endl;
	}
}

clockType::clockType()
{
	hr = 0;
	min = 0;
	sec = 0;
}

clockType::clockType(int hours, int minutes, int seconds)
{
	setTime(hours, minutes, hours);
}
void clockType::setTime(int hours, int minutes, int seconds)
{		// validation
	if (0 <= hours && hours < 24)
		hr = hours;
	else hr = 0;
	if (0 <= minutes && minutes < 60)
		min = minutes;
	else
		min = 0;
	if (0 <= seconds && seconds < 60)
		sec = seconds;
	else
		sec = 0;

}
void clockType::getTime(int &hours, int &minutes, int &seconds) const
{
	hours = hr;
	minutes = min;
	seconds = sec;
}
void clockType::incrementHours()
{
	hr++;
	if (hr > 23)
		hr = 0;
}
void clockType::incrementMinutes()
{
	min++;
	if (min > 59)
	{
		min = 0;
		incrementHours();
	}
}
void clockType::incrementSeconds()
{
	sec++;
	if (sec > 59)
	{
		sec = 0;
		incrementMinutes();
	}
}
void clockType::print()const
{
	if (hr < 10)
		cout << "0";
	cout << hr << ":";
	if (min < 10)
		cout << "0";
	cout << min << ":";
	if (sec < 10)
		cout << "0";
	cout << sec;

}
bool clockType::equalTime(const clockType &other)const
{
	return(hr == other.hr && min == other.min && sec == other.sec);
}
I am getting some constructor errors and an ambiguous call here overload function


Please post the error messages exactly as they appear in your development environment.
error C2668 : 'clockType::clockType': ambiguous call to overloaded function
could be 'clockType::clockType(int,int,int)'
or clockType::clockType(void)'
note: while trying to match the argument list '()'
33
34
clockType();
	clockType(int = 0, int = 0, int = 0);


These are the same because of the default values, the compiler can't differentiate them, as it says.
Last edited on
okay, I m not quite understanding what is happening in this program then.

we want to the three variables in setTime to be initialized to 0 from the beggining.

I also want the private variables in the class to be set to 0 as well.

I was following some youtube tutorials. I'm trying to figure out how his differs from mine.

I was following some youtube tutorials.


Be careful with that - lots of people post stuff that is out of date.

in C++11, one can do this - it's the same as if one had used a member intitializer list

1
2
3
4
private:				// by default all members are private
	int hr = 0;
	int min = 0;
	int sec = 0;


So the default constructor could be empty.

It's a good idea to put names for the parameters in the function declaration and definition - I like to make them the same:

1
2
public:
void clockType::setTime(const int hoursArg, const int minutesArg, const int secondsArg);



1
2
void clockType::setTime(const int hoursArg, const int minutesArg, const int secondsArg)
{		// validation 


I also put Arg on the end of the names. I like to make them the same as in the class definition: hours and hoursArg

> we want to the three variables in setTime to be initialized to 0 from the beggining.

Just remove the (declaration and definition of the) no-arg constructor clockType();

clockType(int = 0, int = 0, int = 0); is a default constructor which would set the members to zero.

A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
http://en.cppreference.com/w/cpp/language/default_constructor
Last edited on
closed account (48T7M4Gy)
Clock is a better name for the class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>

class Clock {
    
public:		//access specifier
    void setTime(int, int, int);	// make functions public to access private var's
    void getTime(int&, int&, int&) const;
    void print() const;
    void incrementSeconds();
    void incrementMinutes();
    void incrementHours();
    bool equalTime(const Clock&) const;
    
    Clock(int = 0, int = 0, int = 0);

private:				// by default all members are private
    int hr;
    int min;
    int sec;
    
};

Clock::Clock(int h, int m, int s)
{
    hr = h;
    min = m;
    sec = s;
}

void Clock::setTime(int hours, int minutes, int seconds)
{		// validation
    if (0 <= hours && hours < 24)
        hr = hours;
    else hr = 0;
    if (0 <= minutes && minutes < 60)
        min = minutes;
    else
        min = 0;
    if (0 <= seconds && seconds < 60)
        sec = seconds;
    else
        sec = 0;
}

void Clock::getTime(int &hours, int &minutes, int &seconds) const
{
    hours = hr;
    minutes = min;
    seconds = sec;
}

void Clock::incrementHours()
{
    hr++;
    if (hr > 23)
        hr = 0;
}

void Clock::incrementMinutes()
{
    min++;
    if (min > 59)
    {
        min = 0;
        incrementHours();
    }
}

void Clock::incrementSeconds()
{
    sec++;
    if (sec > 59)
    {
        sec = 0;
        incrementMinutes();
    }
}

void Clock::print()const
{
    if (hr < 10)
        std::cout << "0";
    std::cout << hr << ":";
    if (min < 10)
        std::cout << "0";
    std::cout << min << ":";
    if (sec < 10)
        std::cout << "0";
    std::cout << sec << std::endl;;
    
}

bool Clock::equalTime(const Clock &other)const
{
    return(hr == other.hr && min == other.min && sec == other.sec);
}

int main() {
    
    const int no_of_employees = 5;
    
    Clock timeIn;
    timeIn.print();
    
    timeIn.incrementHours();
    timeIn.incrementMinutes();
    timeIn.incrementSeconds();
    timeIn.print();
    
    Clock employee[no_of_employees] = {{5,4,2},{1,3,17}};
    for (int i = 0; i < no_of_employees; i++)
    {
        std::cout << "Employee no: " << i << " time in = ";
        employee[i].print();
    }
    
    return 0;
}

00:00:00
01:01:01
Employee no: 0 time in = 05:04:02
Employee no: 1 time in = 01:03:17
Employee no: 2 time in = 00:00:00
Employee no: 3 time in = 00:00:00
Employee no: 4 time in = 00:00:00
Program ended with exit code: 0
Okay, this is making sense to me now, thanks all.
Topic archived. No new replies allowed.