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

Эта программа имеет пользовательские входные пары name/age, а затем выводит их, используя класс. Вот код.

#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 << "Enter name: ";
     cin >> name;
     names.push_back(name);
     cout << endl;
}

void Name_pairs::read_ages()
{
     cout << "Enter corresponding age: ";
     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 << "Enter names and ages. Use 0 to cancel.\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. Как мне это исправить?

Ответ 1

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

int main()
{
   Name_pairs np;
   cout << "Enter names and ages. Use 0 to cancel.\n";
   while(np.test())
   {
      np.read_names();
      np.read_ages();
   }
   np.print();
   keep_window_open();
}

Ответ 2

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

Ответ 3

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

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

Name_pairs np;
np.read_names()

Ответ 4

просто добавьте ключевое слово static в начале типа возвращаемого значения функции.. и затем вы можете получить доступ к функции-члену класса без объекта :) для ex:

static void Name_pairs::read_names()
{
   cout << "Enter name: ";
   cin >> name;
   names.push_back(name);
   cout << endl;
}