#c #class #declaration #member-functions
Вопрос:
слишком мало аргументов в вызове функций? что не так с этим кодом? Я хочу вывести на std::примерно через день
#include <iostream>
#include <string>
class Date
{
public:
Date(unsigned _day, unsigned _month, unsigned _year) : day(_day), month(_month), year(_year) {}
int GetDate(Dateamp; dt)
{
return dt.day;
}
private:
unsigned day, month, year;
};
int main()
{
Date dt(07, 10, 2004);
std::cout << dt.GetDate();
return 0;
std::cin.get();
}
я понимаю принцип, но я не знаю, что делать
/*too few arguments in function call
Error C2660 'Date::GetDate': function does not take 0 arguments */
Комментарии:
1. В отличие от python, в C это (self в python) неявно передается нестатической функции-члену. Вы должны определить
int GetDate()
и просто вернутьсяday
.2. Независимо от ошибки, вы должны сделать
GetDate
const, чтобы иметь возможность вызывать его для объектов const:int GetDate() const {...}
(так как он не изменяет никаких полей).
Ответ №1:
Как эта функция-член
int GetDate(Dateamp; dt)
{
return dt.day;
}
является нестатической функцией-членом, то это естественно, когда она выводит день элемента данных объекта, для которого она вызывается. Но он определяется параметром, который принимает другой объект этого типа Date
.
Таким образом, в этом вызове функции
std::cout << dt.GetDate();
вам нужно указать аргумент типа Date
, например
Date dt(07, 10, 2004);
std::cout << dt.GetDate( dt );
Но в этом нет большого смысла.
Функция должна быть определена в классе следующим образом
int amp; GetDate()
{
return day;
}
с его перегрузкой
const int amp; GetDate() const
{
return day;
}
В данном случае этот фрагмент кода
Date dt(07, 10, 2004);
std::cout << dt.GetDate();
будет иметь смысл.
Хотя было бы лучше назвать функцию как GetDay
.
Обратите внимание, что это утверждение
std::cin.get();
не имеет эффекта, потому что он помещается после инструкции return. Может быть, ты имеешь в виду
std::cin.get();
return 0;
Комментарии:
1. const int amp; GetDate() const {} Я этого не понимаю
2. @SamuelRobb Такая функция может быть вызвана для постоянного объекта типа Дата. Например, если вы объявите постоянную дату dt(07, 10, 2004); тогда вы можете вызывать только постоянную функцию-член GetDate. В противном случае компилятор выдаст ошибку, если вы попытаетесь вызвать непостоянную функцию-член.
3. const int amp; GetDate() const {} здесь меня смущает константа в const int и ссылка
4. @SamuelRobb Без указанного типа возврата функция вернет копию дня элемента данных. Но обычно вам нужен исходный объект, например, для использования его в контейнере.
5. Пока вы не измените внутреннюю реализацию, и тогда у вас больше не будет int, на который можно ссылаться… Верните копию.
Ответ №2:
Вы определили GetDate()
как нестатический метод Date
класса, и он принимает явную Dateamp;
ссылку на объект в качестве параметра. Но main()
не передает Date
объект в этот параметр, отсюда и ошибка.
Нет необходимости передавать объект явно. Как нестатический метод, GetDate()
имеет скрытый this
параметр, который ссылается на Date
вызываемый объект GetDate()
.
Попробуйте это вместо этого:
#include <iostream>
#include <string>
class Date
{
public:
Date(unsigned _day, unsigned _month, unsigned _year) : day(_day), month(_month), year(_year) {}
int GetDate() const
{
return day; // this->day
}
private:
unsigned day, month, year;
};
int main()
{
Date dt(07, 10, 2004);
std::cout << dt.GetDate();
return 0;
std::cin.get();
}
Комментарии:
1. есть ли у всех функций-членов скрытое это ->?
2. @SamuelRobb нестатические функции- члены делают, да
3. Все нестатические функции-члены имеют
this
. Удобное чтение (также объясняет, почемуconst
оно было добавлено): en.cppreference.com/w/cpp/language/member_functions . Поскольку существуют нестатические функции-члены, вот некоторые сведения о статических функциях-членах . Наиболее примечательно, что у них нетthis
и, следовательно, им не нужен объект для вызова.
Ответ №3:
В идеале вам следует обновить реализацию вашей GetDate
функции.
int GetDate()
{
return day;
}
Комментарии:
1. Рационально для этого:
GetDate
является функцией-членом. Нет необходимости передаватьDate
экземпляр, потому что функция вызывается на aDate
и может получить доступ к ее членамDate
.2. почему я не могу получить доступ с помощью этого параметра?
3. Если вы обращаетесь с параметром, вам необходимо указать параметр:
std::cout << dt.GetDate(dt);
. Видишь, как у тебя двеdt
буквы «с»? Ты действительно хочешь иметь только одногоdt
. Либо вы делаете функцию статическим членом и передаетеdt
ее, либо оставляете ее нестатическим членом и вызываете ееdt
. Нет необходимости делать и то, и другое.
Ответ №4:
Функция GetDate имеет параметр, который вы не передаете в функции main.
Это должно быть
Date a(1,1,2001);
std::cout << dt.GetDate(a);
Комментарии:
1. И
a
для чего будет использоваться внутриGetDate
? Имеет ли смысл ссылатьсяgetDate
на одинDate
экземпляр, чтобы вернутьday
совершенно другойDate
? Доу сит имеет смысл сдать по-другомуDate
, а потом не использовать этоDate
?2. Я знаю, что код не имеет смысла, но он спрашивал об ошибке компиляции. Ошибка компиляции вызвана отсутствием аргумента в вызове. Я мог бы спросить, почему функция с именем GetDate возвращает только день.
3. Когда код делает что-то, что не имеет смысла, предпочитайте писать ответ, в котором код имеет максимальный смысл. Это означало бы удалить неиспользуемый параметр из функции и объяснить, как этот параметр вызвал проблему и почему в нем не было необходимости в первую очередь. Здесь вы решили предложить сделать что-то столь же бессмысленное, и теперь у спрашивающего две проблемы в коде вместо ошибки компилятора. Если в вопросе слишком мало смысла, чтобы дать разумный ответ, вы просите разъяснений и голосуете за закрытие вопроса, если у вас есть такая возможность.