0

Неудалось вызвать член-функцию без объекта

13

Описание проблемы

Я пытаюсь создать программу на C++, которая принимает пары имя/возраст от пользователя и затем выводит их, используя класс Name_pairs. Привожу код ниже.

#include "std_lib_facilities.h"

class Name_pairs
{
public:
       bool test();
       void read_names();
       void read_ages();
       void print();
private:
        vector<string> names;
        vector<double> ages;
        string name;
        double age;
};

void Name_pairs::read_names()
{
     cout << "Введите имя: ";
     cin >> name;
     names.push_back(name);
     cout << endl;
}

void Name_pairs::read_ages()
{
     cout << "Введите соответствующий возраст: ";
     cin >> age;
     ages.push_back(age);
     cout << endl;
}

void Name_pairs::print()
{
     for(int i = 0; i < names.size() && i < ages.size(); ++i)
             cout << names[i] << " , " << ages[i] << endl;
}

bool Name_pairs::test()
{
   int i = 0;
   if(ages[i] == 0 || names[i] == "0") return false;
   else{
        ++i;
        return true;}
}

int main()
{
    cout << "Введите имена и возраст. Используйте 0 для отмены.\n";
    while(Name_pairs::test())
    {
     Name_pairs::read_names();
     Name_pairs::read_ages();
     }
     Name_pairs::print();
     keep_window_open();
}

Однако, в функции int main() при попытке вызвать методы класса я получаю ошибку "cannot call 'whatever name is' function without object." Я предполагаю, что это связано с тем, что компилятор ожидает вызов функций через объект класса, например, variable.test() или variable.read_names().

Как мне исправить эту проблему?

4 ответ(ов)

0

Для того чтобы вызвать методы некоего объекта, вам необходимо создать его экземпляр. Члены функции требуют, чтобы на них был создан объект, иначе их не получится использовать самостоятельно. Функция main() могла бы выглядеть, например, так:

int main()
{
   Name_pairs np;
   cout << "Введите имена и возраст. Используйте 0 для отмены.\n";
   while(np.test())
   {
      np.read_names();
      np.read_ages();
   }
   np.print();
   keep_window_open();
}

В этом примере мы создаем объект np класса Name_pairs, и затем вызываем его методы для ввода имен и возрастов.

0

Если вы хотите называть их именно так, вам следует объявить их статическими.

0

Чтобы сделать функцию доступной без создания экземпляра класса, просто добавьте ключевое слово static перед типом возвращаемого значения функции. Это позволит вам вызывать член-функцию класса без создания объекта.

Например:

static void Name_pairs::read_names()
{
   cout << "Введите имя: ";
   cin >> name;
   names.push_back(name);
   cout << endl;
}

В этом примере функция read_names() может быть вызвана без создания экземпляра класса Name_pairs.

0

Вы правы — вы объявили новый пользовательский тип (Name_pairs), и вам нужно создать переменную этого типа, чтобы его использовать.

Код должен выглядеть следующим образом:

Name_pairs np;
np.read_names();
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь