слишком мало аргументов в вызове функций?

#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 экземпляр, потому что функция вызывается на a Date и может получить доступ к ее членам 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. Когда код делает что-то, что не имеет смысла, предпочитайте писать ответ, в котором код имеет максимальный смысл. Это означало бы удалить неиспользуемый параметр из функции и объяснить, как этот параметр вызвал проблему и почему в нем не было необходимости в первую очередь. Здесь вы решили предложить сделать что-то столь же бессмысленное, и теперь у спрашивающего две проблемы в коде вместо ошибки компилятора. Если в вопросе слишком мало смысла, чтобы дать разумный ответ, вы просите разъяснений и голосуете за закрытие вопроса, если у вас есть такая возможность.