Ошибка cannot call member function without object

This program has the user input name/age pairs and then outputs them, using a class.
Here is the code.

#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();
}

However, in int main() when I’m trying to call the functions I get "cannot call 'whatever name is' function without object." I’m guessing this is because it’s looking for something like variable.test or variable.read_names. How should I go about fixing this?

Ziezi's user avatar

Ziezi

6,3453 gold badges39 silver badges48 bronze badges

asked Jul 14, 2009 at 20:15

trikker's user avatar

3

You need to instantiate an object in order to call its member functions. The member functions need an object to operate on; they can’t just be used on their own. The main() function could, for example, look like this:

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();
}

Jason Plank's user avatar

Jason Plank

2,3425 gold badges31 silver badges40 bronze badges

answered Jul 14, 2009 at 20:19

sth's user avatar

sthsth

221k53 gold badges281 silver badges367 bronze badges

0

If you want to call them like that, you should declare them static.

answered Jul 14, 2009 at 20:20

Rob K's user avatar

Rob KRob K

8,7272 gold badges32 silver badges36 bronze badges

2

just add static keyword at the starting of the function return type..
and then you can access the member function of the class without object:)
for ex:

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

answered Jun 4, 2019 at 9:57

Ketan Vishwakarma's user avatar

You are right — you declared a new use defined type (Name_pairs) and you need variable of that type to use it.

The code should go like this:

Name_pairs np;
np.read_names()

O'Neil's user avatar

O’Neil

3,7904 gold badges15 silver badges30 bronze badges

answered Jul 14, 2009 at 20:21

dimba's user avatar

dimbadimba

26.5k33 gold badges140 silver badges196 bronze badges

Trusted answers to developer questions

Educative Answers Team

Free System Design Interview Course

Many candidates are rejected or down-leveled due to poor performance in their System Design Interview. Stand out in System Design Interviews and get hired in 2023 with this popular free course.

The “cannot call member function without object” error is a common C++ error that occurs while working with classes and objects. The error is thrown when one tries to access the functions of a class without instantiating it.

svg viewer

Code

Consider the following C++ code snippets that depict the code with the error scenario and the correct code. The solution is to create an object of a class (instantiation) before using its methods.

#include <iostream>

using namespace std;

class Employee

{

public:

string name = "John";

int age = 25;

void printData()

{

cout << "Employee Name: " << name << endl;

cout << "Employee Age: " << age << endl;

}

};

int main()

{

Employee::printData();

return 0;

}

RELATED TAGS

member function

object

error

without

c++

Copyright ©2023 Educative, Inc. All rights reserved

Trusted Answers to Developer Questions

Related Tags

member function

object

error

without

c++

Learn in-demand tech skills in half the time

Copyright ©2023 Educative, Inc. All rights reserved.

soc2

Did you find this helpful?

  1. Fix the error: cannot call member function without object in C++
  2. Use an Instance of the Class to Access the Member Functions
  3. Use Static Member Functions

Error: Cannot Call Member Function Without Object in C++

This article describes the commonly occurring error cannot call member function without object while doing object-oriented programming using C++. Furthermore, it also provides potential fixes to the error.

Fix the error: cannot call member function without object in C++

A common error in C++ frequently occurs when working in object-oriented programming, stating cannot call member function without object. The cause of this error is that you are calling some member method of the class without instantiating the class.

Every class has a set of data members and some member functions. We need to create the class object to access the member methods or functions and then call/access the methods using this object.

Consider the following code.

#include<iostream>
using namespace std;
class Rectangle{
    private:
        int length=5;
        int width=8;
    public:
    double getArea()
    {
        return length*width;

    }
};
int main()
{
    cout<<"Area: "<<Rectangle::getArea()<<endl;
}

This code will generate the following output.

cannot call member function without object

Line #16 in the above code snippet tries to call the getArea() method using the class name. All the non-static members of a class must only be accessed through an object of the class; therefore, the line generates the error.

Use an Instance of the Class to Access the Member Functions

The error can be solved by calling the function/method with an object of the class like this:

int main()
{
    Rectangle r;
    cout<<"Area: "<<r.getArea()<<endl;
 }

This will give the correct output.

Use Static Member Functions

Static member functions are the functions of a class that do not need an object to call them. They can be called directly with the class name using the scope resolution operator ::.

Certain limitations must be kept in mind when using the static member functions. A static member function can access only the static data members of the class and can only call the other static member functions.

Let’s look at the example below discussing the solution to the cannot call member function without object error.

#include <iostream>

using namespace std;

class Rectangle{
    private:
        int length =5;
        int width=8;
    public:
    double getArea()
    {
        return length*width;
    }
    static void getShapeName()
    {
        cout<<"Hello, I am a Rectangle."<<endl;
    }

};
int main()
{

    Rectangle r ;
    cout<<"Area: "<<r.getArea()<<endl;
    Rectangle::getShapeName();
 }

This will give the following output.

Area: 40
Hello, I am a Rectangle.

Mesteriis

599 / 237 / 69

Регистрация: 08.08.2015

Сообщений: 1,637

1

20.01.2017, 22:07. Показов 11218. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Доброе время суток ребят такая фигня, решил значит наконец то классы освоить но прям беда! чой то не пойму

h файл

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef MCT_H
#define MCT_H
#include <string>
 
class MCT
{
private:
 
    static std::string FirstString;
    static std::string SeacondString;
 
public:
 
    MCT();
 
    void PrintFS ();
    void PrintSS ();
    bool AddFS(std::string InputString);
    bool AddSS(std::string InputString);
};
 
#endif // MCT_H

реализация класса

C++ (Qt)
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
#include "mct.h"
 
MCT::MCT()
{
 
}
 
 
MCT::PrintFS ()
{
    if (FirstString.size()==0) std::cout << "FirstString is NULLn";
    std::cout<< FirstString << std::endl;
}
 
MCT::PrintSS ()
{
    if (FirstString.size()==0) std::cout << "FirstString is NULLn";
    std::cout<< FirstString << std::endl;
}
 
MCT::AddFS(std::string InputString)
{
    FirstString=InputString;
//    if (FirstString==InputString) return false;
    return true;
}
 
MCT::AddSS(std::string InputString)
{
    SeacondString=InputString;
//    if (SeacondString==InputString) return false;
    return true;
}

ну и маин файл

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
#include "mct.h"
 
using namespace std;
 
int main()
{
    new MCT;
 
    MCT::AddFS("test 1");
    MCT::AddSS("test 2");
 
    MCT::PrintFS();
    MCT::PrintSS();
 
 
    return 0;
}

и собственно ошибка

Bash
1
2
3
C:UsersAlexanderDocumentsjson_stringmain.cpp:21: ошибка: cannot call member function 'bool MCT::AddFS(std::string)' without object
     MCT::AddFS("test 1");
                        ^



0



GbaLog-

Любитель чаепитий

3737 / 1796 / 563

Регистрация: 24.08.2014

Сообщений: 6,015

Записей в блоге: 1

20.01.2017, 22:28

2

Лучший ответ Сообщение было отмечено Mesteriis как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
#include "mct.h"
 
using namespace std;
 
int main()
{
    MCT* mct = new MCT;
 
    mct->AddFS("test 1");
    mct->AddSS("test 2");
 
    mct->PrintFS();
    mct->PrintSS();
 
 
    return 0;
}



1



599 / 237 / 69

Регистрация: 08.08.2015

Сообщений: 1,637

20.01.2017, 22:32

 [ТС]

3

GbaLog-, А можешь в двух словах объяснить?



0



Любитель чаепитий

3737 / 1796 / 563

Регистрация: 24.08.2014

Сообщений: 6,015

Записей в блоге: 1

20.01.2017, 22:39

4

Цитата
Сообщение от Mesteriis
Посмотреть сообщение

А можешь в двух словах объяснить?

Если метод класса не статический, то для обращения к ним нужен экземпляр этого класса.



0



Автор Тема: ошибка: cannot call member function without object  (Прочитано 6805 раз)
megido

Гость


значит есть у меня вот такая функция

шапка:
static void CALLBACK ProcessBuffer(const void *buffer, DWORD length, void *user);
код:
void  Player::ProcessBuffer(const void *buffer,DWORD length,void *user)
{
    emit SetSongName(time_info);

}
vold Player::Play()
{
    chan = BASS_StreamCreateURL(url,0,BASS_STREAM_BLOCK|BASS_STREAM_STATUS|BASS_STREAM_AUTOFREE,ProcessBuffer,this);

 }

когда я пытаюсь в ней послать сигнал получаю вот эту ошибку

ошибка: cannot call member function ‘void Player::SetSongName(QString)’ without object
     emit SetSongName(time_info);

кстати вызвать из нее другую функцию я тоже не могу

какой объект оно хочет?

« Последнее редактирование: Июнь 19, 2016, 02:12 от megido »
Записан
Bepec

Гость


Без кода можем только анекдот рассказать, за денежку.


Записан
Racheengel

Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679

Я работал с дискетам 5.25 :(

Просмотр профиля


а SetSongName помечена как Q_SIGNAL?


Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт

kambala


из статического метода сигнал ты не пошлешь, так как это метод на уровне класса, не конкретного объекта.

тебе надо в качестве дополнительного параметра этому коллбэку передавать this (параметр user, насколько я понимаю), потом в коллбэке кастануть user к классу Player и вызвать метод (его надо написать), который внутри и пошлет сигнал.

« Последнее редактирование: Июнь 19, 2016, 02:29 от kambala »
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher

megido

Гость


а SetSongName помечена как Q_SIGNAL?

а как же


Записан
megido

Гость


из статического метода сигнал ты не пошлешь, так как это метод на уровне класса, не конкретного объекта.

тебе надо в качестве дополнительного параметра этому коллбэку передавать this (параметр user, насколько я понимаю), потом в коллбэке кастануть user к классу Player и вызвать метод (его надо написать), который внутри и пошлет сигнал.

спасибо за наводку. работает

    Player* pthis = (Player*)user;
    pthis->SetTimeInfo(time_info);


Записан

баловался с qt и столкнулся с непонятной мне ошибкой

error: cannot call member function `void GRAPH::assign(GRAPH)’ without object

main.cpp

Код:

#include <QtCore/QCoreApplication>
#include «GRcl.cpp»
#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

    GRAPH G;

    GRAPH::assign(G);

    return 1;
}

GRcl.cpp

Код:

#include <vector>
#include <iostream.h>

class GRAPH {

    public:
    int ** War;

    void assign (class GRAPH G)
    {
        int N,CONvert,EWeight,i;
        cout << «type in number of verts»<< endl;
        cin>>N;
        for (i=0; i<N ; i++)
        {
            for ( ; ; )
            {
                cout << «Assign vert.»<<i<<endl;
                cout << «connect to vert… (0 to finish)»<<endl;
                cin>>CONvert;
                if (CONvert==0) break;
                cout<< «Assign weight of edge»<<i<<«-«<<CONvert<<endl;
                cin>>EWeight;
                G.War[CONvert]=EWeight;
                cout<<» Edge «<<i<<«-«<<CONvert<<» created.»<<endl;
             }
        }

      }
};

ошибка говорит что нет объекта при вызове функции GRAPH::assign();
но есть же он : GRAPH::assign(G)
в чем дело?

2 ответа

8.9K

19 марта 2011 года

Apach47

130 / / 14.06.2010

Попробуй создать .hpp файл, в который вынести объявление класса, а затем .hpp файлик подключить к main.cpp

397

19 марта 2011 года

SergPas

527 / / 03.02.2007

Ошибка-то как раз понятная.
Ты не создал объект типа GRAPH (точнее создал, но не вызвал его метод assign), метод assign() которого вызываешь; к тому же метод assign() не объявлен в классе как статический (с модификатором static). Отсюда и возникает ошибка. В данном случае создавать объект типа GRAPH и передавать методу assign() тот же объект крайне глупо, в этом случае лучше сделать метод assign статическим, тогда и объект создавать не надо и появится смысл передавать методу assign() объект типа GRAPH, либо вообще стоит пересмотреть назначение метода assign().

  • Forum
  • Beginners
  • Cannot call member function without obje

Cannot call member function without object

Hi, I’m having problem calling a function from a class in the main.cpp. Could someone tell me how to fix this please?

1
2
3
4
5
6
7
8
9
10
11
12
//main.cpp

#include <iostream>
#include <fstream>
#include <string>
#include "CD.h"

using namespace std;
class CD;

double mind, maxd;
CD dwindow = CD::setd(mind, maxd);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//CD.h

#ifndef CD_H_
#define CD_H_

#include <string>
#include <vector>

using namespace std;

class CD {
public:
	virtual ~CD();
	CD(Data, double, double);

	/// Virtual copy constructor.
	virtual CD* clone() const = 0;

	void setd(double mind, double maxd);
};
#endif 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//CD.cpp

#include "iostream"
#include "CD.h"

using namespace std;

//method: set min and max d's
void CD::setd(double mind, double maxd) {
	_mind = mind;
	_maxd = maxd;
}
CD::~CD() {
}

If I set the method to be static, then I get the following error: «cannot declare member function ‘static void CD::setd(double, double)’ to have static linkage».
Thank you in advance for your help!

A class represents a «thing», but the class itself is not actually a thing. You need to create objects of that class. Each object is its own thing.

For example… string is a class. This means that you can have multiple «objects» of type string. Each has its own string data.

1
2
string foo = "hi";
string bar = "there";

Here, foo and bar are both strings. Now you can call member functions (such as the length function) by using the object name and the dot operator:

 
size_t len = foo.length();  // get the length of the foo string 

But without an object, a call to length makes no sense:

1
2
3
4
size_t len = string::length();  // ??  what string are we getting the length of?
  //  is it foo?  is it bar?  is it something else?
  // doesn't make any sense!
  //  so the compiler will give this line an error. 

This is basically what you’re doing. You’re trying to call setd, but you’re not telling the compiler which CD object you want to set. So it spits that error at you.

You’ll need to create an object:

1
2
3
CD myCD;

myCD.setd( ... );

Last edited on

where do I create that object?

Objects are just like normal variables (like ints, doubles, etc). Declare it wherever you need to use it.

Topic archived. No new replies allowed.

Язык программирования представляет собой набор различных концепций, встроенных функций и операций; это также приводит к множеству ошибок. Эти ошибки могут быть логического типа, синтаксические ошибки и другие. Вы можете получить много ошибок при написании кода, когда делаете в коде логические или синтаксические ошибки. Одна из ошибок многих из этих исключений — «невозможно вызвать функцию-член без объекта». Это происходит, когда мы пытаемся вызвать функцию в нашей программе, не создавая объект класса. Итак, это руководство содержит примеры возникновения этой ошибки и решение для ее устранения. Убедитесь, что вы работали в системе Ubuntu 20.04, и запустите терминал с помощью «Ctrl+Alt+T». Начнем с примеров.

Содержание

  1. Пример 1
  2. Пример 2
  3. Заключение

Пример 1

Давайте начнем наш первый пример, чтобы уточнить, как мы получаем ошибку «невозможно вызвать функцию-член без объекта» в коде C++. Итак, первое, что нам нужно сделать, это создать файл c++. Этот файл можно создать с помощью любого текстового редактора в проводнике или в оболочке. Вы можете попробовать открыть его с помощью редактора vim, текстового редактора или любого другого редактора, например редактора GNU Nano. Итак, мы напрямую открываем этот вновь созданный файл в редакторе GNU Nano с помощью команды «nano». Теперь пустой вновь созданный файл запускается в редакторе Nano и готов к использованию.

Мы начали наш код с добавления некоторых заголовочных файлов

Мы начали наш код с добавления некоторых заголовочных файлов, т. е. «iostream». Вы можете использовать пространство имен «std» в коде, объявляя его перед основной функцией. В противном случае вам придется использовать ключевое слово «std» с каждым предложением cout и cin в программе. Итак, мы инициализировали его перед основным методом с помощью ключевого слова «using». Мы создали в коде простой класс с именем «A». Этот класс содержит одну определяемую пользователем функцию с именем «show()». Функция содержит объявление переменной символьного типа с именем «a». Первый оператор cout этой функции запрашивает символ, который должен быть добавлен пользователем. Предложение «cin» позволяет пользователю добавить этот символ в оболочку и сохранить его в переменной «a». Последний оператор cout использовался здесь для отображения символа в оболочке, который ввел пользователь.

Теперь класс закончился, и мы запустили основной метод. Пришло время вызвать функцию, чтобы выполнить ее, не используя ничего другого. Итак, мы просто использовали имя класса «A» с «::» для вызова функции «show()» в основном методе. Основной метод здесь закрыт. Мы готовы сохранить этот код с помощью Ctrl+S, так как он уже готов.

Вернитесь к терминалу, используя «Ctrl + X

Вернитесь к терминалу, используя «Ctrl + X. Теперь пришло время скомпилировать код с помощью встроенного в Ubuntu 20.04 компилятора c++. Таким образом, мы использовали здесь инструкцию компилятора «g++», чтобы просто скомпилировать файл кода и посмотреть, не содержит ли он ошибок. При компиляции показывает ошибку. Это означает, что мы не можем просто выполнить или вызвать функцию show() класса «А» без создания объекта этого класса.

Теперь пришло время скомпилировать код с помощью встроенного в

Итак, нам нужно еще раз обновить файл кода. Воспользуйтесь редактором nano еще раз и устраните эту ошибку. Таким образом, старый файл снова открывается. Пока нам нужно изменить только функцию main(), чтобы избежать этой ошибки. Итак, мы создали объект «obj» класса «А». Теперь этот объект «obj» использовался здесь для вызова функции show() класса «A», используя «точку» между именем объекта и именем функции. Сохраните код, чтобы отразить изменения при выполнении, используя простую горячую клавишу, т. е. «Ctrl+S». Обновленный код показан на изображении ниже. Вернемся к терминалу, чтобы скомпилировать обновленный код с помощью «Ctrl+X».

Теперь этот объект «obj» использовался здесь для вызова

Использовал инструкцию компилятора «g++» для компиляции кода. На этот раз у нас нет ошибки. При выполнении кода мы получили результат, показанный ниже. Он попросил ввести символ, добавив «А». В свою очередь, он отображал символ на оболочке. Использование объекта для вызова функции show().

Использование объекта для вызова функции show

Пример 2

Давайте рассмотрим еще один пример получения той же ошибки и последующего ее устранения. Итак, мы открыли файл error.cc и создали показанный ниже код. Этот код был запущен из заголовочного файла iostream, пространство имен std, и завершился в основном методе. Наша программа содержит два класса, A и B. A — родительский класс, а B — дочерний класс A, наследующий здесь его свойства. Родительский класс A содержит функцию «print()», имеющую один оператор, показывающий, что это функция родительского класса. Дочерний класс содержит функцию «show()» с оператором cout, показывающим, что метод дочернего класса был выполнен. Функция main() содержит простой метод «::» для вызова обоих методов с использованием соответствующих классов, т. е. «A» и «B». Давайте просто запустим этот код, чтобы посмотреть, как он работает.

Давайте рассмотрим еще один пример получения той же

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

Давайте просто еще раз откроем файл с помощью «наноредактора»

Давайте просто еще раз откроем файл с помощью «наноредактора». Нет необходимости менять весь код; только метод main() требует небольшой модификации. Как вы можете видеть, мы создали объект obj1 родительского класса «A» и использовали его для вызова функции для метода print(). Затем мы создали объект «obj2» дочернего класса B и сделали здесь вызов функции «show ()», чтобы выполнить его. Мы также можем избежать создания объекта родительского класса «obj1» и по-прежнему вызывать его функцию, используя объект дочернего класса «obj2». Обе функции в родительском и дочернем классах имеют разные имена, поэтому это не вызовет никакой ошибки. Давайте просто сохраним файл кода с помощью Ctrl+S и вернемся в терминал, чтобы посмотреть, устранена ли ошибка или нет.

Мы также можем избежать создания объекта родительского класса «obj1»

После компиляции обновленного кода мы видим, что ошибка «невозможно вызвать функцию-член без ее объекта» окончательно устранена, и код готов к выполнению. Функции родительского и дочернего классов выполнялись, как показано при запуске кода.

Функции родительского и дочернего классов выполнялись

Заключение

Эта статья содержит простую демонстрацию создания ошибки «невозможно вызвать функцию-член без объекта» в программе на C++. Мы использовали концепцию классов, чтобы сделать это возможным. Затем мы также продемонстрировали решение для устранения этой ошибки в примерах. Мы очень надеемся, что эта статья будет полезна всем тем, кто не знаком с C++.

Понравилась статья? Поделить с друзьями:
  • Ошибка cancel pubg
  • Ошибка can шины форд фокус 2 рестайлинг
  • Ошибка can шины hyundai
  • Ошибка can сообщения ebc1 таймаут сообщения шины can
  • Ошибка can сообщения dm1spn2 ошибка шины can