Форум программистов, компьютерный форум CyberForum.ru

Ошибка перегрузки конструктора - C++

Восстановить пароль Регистрация
 
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 52
10.06.2013, 17:29     Ошибка перегрузки конструктора #1
Есть класс в котором 2 конструктора
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef DATE_H
#define DATE_H
 
class Date
{
    public:
        Date(int = 1, int = 1, int = 1990);
        Date(int = 1, int = 1990);
        void print() const;
        ~Date();
    private:
        int month;
        int day;
        int year;
        static const char *namesMonth[13];
 
        int checkDay(int) const;
};
#endif
здесь их код

C++
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
Date::Date(int mn, int dy, int yr)
{
    if(mn>0 && mn<=12)
      {
        month=mn;
      }
    else
      {
          month=1;
          cout<<"Invalid month ("<<mn<<") set to 1.\n";
      }
 
    year=yr;
    day=checkDay(dy);
 
    cout<<"Date object constructors for date ";
    print();
    cout<<endl;
}
        
Date::Date(int smds, int yr)
{
    int monthCount=1;
    int dayCount=1;
    
    if(year%4==0 && (smds>366 || smds<1))
      smds=1;
    else if(smds>365 || smds<1)
      smds=1;
    
    int daysPerMonth[13]=
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        
    for(int i=1; i<=smds; i++)
        {
         if((year%4==0 && monthCount==2) && i==(daysPerMonth[monthCount]))
            {
            monthCount++;
            dayCount=1;
            smds-=i;
            i=1;    
            continue;        
            }
        
         if(i==daysPerMonth[monthCount])
           {              
            monthCount++;
            dayCount=1;
            smds-=i;
            i=1;
           }
                   
         dayCount++; 
 
      }
      
   year=yr;
   day=dayCount;
   month=monthCount;
   
    cout<<"Date object constructors for date ";
    print();
    cout<<endl;
}
код main

C++
1
2
3
4
5
6
7
8
int main(void)
{
    Date birth(205, 1949);
 
    cout<<endl;
 
    return 0;
}
почему компилятор ругается?????

Bash
1
2
3
4
5
main.cpp: В функции «int main()»:
main.cpp:9:22: ошибка: вызов перегруженной «Date(int, int)» имеет неоднозначную трактовку
main.cpp:9:22: замечание: candidates are:
Date.h:8:4: замечание: Date::Date(int, int)
Date.h:7:3: замечание: Date::Date(int, int, int)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pakisan
14 / 14 / 1
Регистрация: 04.01.2013
Сообщений: 61
10.06.2013, 17:52     Ошибка перегрузки конструктора #2
C++
1
Date birth(205, 1949);
Тебе понятно, а его ты путаешь, ибо подойдет
C++
1
Date(int = 1, int = 1, int = 1990);
и
C++
1
 Date(int = 1, int = 1990);
Почитай подробнее о перегружаемых функциях, там об этом подробно написано.
В твоем случае ты зря определил дефолтные значения, это и приводит к неоднозначности. Смотри: ты передаешь два аргумента, желая вызвать 2 конструктор, но тут проблемка, а именно это подойдет и первому т.к. смотри выше
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 52
10.06.2013, 17:58  [ТС]     Ошибка перегрузки конструктора #3
Pakisan, Почему первый конструктор подходит? Я передаю 2 аргумента а он принимает 3, т.е. должен сработать второй. Вроде....
Pakisan
14 / 14 / 1
Регистрация: 04.01.2013
Сообщений: 61
10.06.2013, 18:31     Ошибка перегрузки конструктора #4
Внимательней читай что я написал:
В твоем случае ты зря определил дефолтные значения, это и приводит к неоднозначности. Смотри: ты передаешь два аргумента, желая вызвать 2 конструктор, но тут проблемка, а именно это подойдет и первому т.к.
ты зря определил дефолтные значения
Тобишь он берет аргументы заданные тобой и тут неоднозначность: с одной стороны это 2 конструктор, но с другой стороны присутствуют дефолтные параметры, а это значит подходит и 1
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
10.06.2013, 18:34     Ошибка перегрузки конструктора #5
Потому что присутствуют аргументы по умолчанию. В принципе можно было оставить один конструктор
C++
1
Date(int = 1, int = 1, int = 1990);
И он бы одинаково работал с тремя, двумя, одним передаваемыми аргументами и даже без аргументов вообще. Т.е.
C++
1
2
3
4
5
Date d1(6, 10, 2013);   //Вызывается в таком же виде
Date d2(6, 10);   //Вызывается Date d1(6, 10, 1990)
Date d3(6);   //Вызывается Date d1(6, 1, 1990)
Date d4();   //Вызывается Date d1(1, 1, 1990)
Date d5;   //Вызывается Date d1(1, 1, 1990)
Прочитайте еще раз про аргументы функций по умолчанию.
Yandex
Объявления
10.06.2013, 18:34     Ошибка перегрузки конструктора
Ответ Создать тему
Опции темы

Текущее время: 08:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru