Не объявленная в этой области ошибка для функции

#c #function #scope #declare

#c #функция #область видимости #объявить

Вопрос:

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

Ошибка из g : «ошибка: ‘convert’ не был объявлен в этой области»

Заранее спасибо.

A.h:

 class A
{
    public:

        int convert(char bcd);

};
  

program.cpp:

 #include "A.h"
#include <iostream>
#include<stdio.h>

using namespace std;


int A::convert(char b)
{
    return b*5;
}

int main(){

    char myword = '27'; 
    char cc = convert(myword); //scope error here
    cout << "Number is: " << cc << endl;

   return 0;
}
  

Комментарии:

1. convert принадлежит A . Вы запрашиваете бесплатную convert функцию.

Ответ №1:

Сама ошибка заключается в том, что у вас нет какой-либо «свободной функции», определенной по имени convert() , которая находится в любой области, доступной непосредственно из области, в которой вы пытаетесь ее вызвать. У вас есть метод-член («функция») class A , но ни один из них не определен вне этого класса. Итак, да, у вас есть «функция» с именем convert() defined, но она недоступна в области, в которой вы пытаетесь ее вызвать. Вам придется добавить что-нибудь, чтобы сообщить компилятору, где найти эту « convert() » функцию, которую вы пытаетесь вызвать. Есть несколько способов сделать это:

  1. Для нестатической функции-члена класса (обычно называемой «методом», когда она является частью класса) вам сначала понадобится объект типа этого класса, чтобы вызвать метод.
  2. Для статических функций-членов класса (обычно называемых «статическими методами») вы можете вызвать ее, используя объект этого типа, чтобы разрешить область видимости, или, поскольку это статический метод, вы можете использовать имя класса (вместе с :: оператором разрешения области видимости) для разрешения области видимости.
  3. Если у вас есть «свободная функция», которая определена в отдельном пространстве имен, которое не охватывает область, в которой вы пытаетесь вызвать функцию, вам нужно будет использовать либо :: оператор разрешения области видимости (например, « namespaceName::functionName() «), либо использовать ключевое слово « using «, чтобы перенести имя этой функции в текущую область.

Поскольку вы спрашиваете о методе-члене класса, я проигнорирую пункт 3 выше в следующем обсуждении….

Будет ли у вас экземпляр class A ? Если это так, допустим, вы называете это «fred», тогда вы могли бы вызвать fred.convert(myword); . Но A::convert() не использует никаких данных-членов class A , поэтому, возможно, вы хотите, чтобы это был статический метод-член (т. Е. его можно вызывать даже без объекта типа класса), в котором вам нужно было бы объявить метод как static , и при его вызове используйте « A::convert(myword); «.

Вот пример создания экземпляра class A и вызова метода A::convert() на нем:

 ===== file 'A.h' =====
class A
{
    public:
        int convert(char bcd);
};

===== file 'program.cpp' =====
#include "A.h"
#include <iostream>
#include<stdio.h>

using namespace std;

int A::convert(char b)
{
    return b*5;
}

int main()
{
    char myword = '27';
    A fred; // create an instance of class A named "fred"
    char cc = fred.convert(myword);
    cout << "Number is: " << cc << endl;
}
  

Вот пример, в котором A::convert() является статическим методом-членом, и экземпляр класса не требуется для вызова метода:

 ===== file 'A.h' =====
class A
{
    public:
        static int convert(char bcd); // <--- note 'static' keyword
};

===== file 'program.cpp' =====
#include "A.h"
#include <iostream>
#include<stdio.h>

using namespace std;

int A::convert(char b)
{
    return b*5;
}

int main()
{
    char myword = '27';
    A fred; // create an instance of class A named "fred"
    char cc = fred.convert(myword); // you can call convert() on an A object
    char dd = A::convert(myword); // or you can call it without an A object
    cout << "Number cc is: " << cc << endl;
    cout << "Number dd is: " << dd << endl;
}
  

Ответ №2:

Вы путаете 3 вещи:

  1. Функции
  2. Методы-члены класса
  3. Методы статического класса

Функция — это набор команд, которые должны выполняться подряд. Вы объявляете их следующим образом:

 type function(type parameter1, type parameter2 /*etc */);
  

Вы определяете их следующим образом:

 type function(type parameter1, type parameter2 /*etc */) {
  // implementation...
}
  

И вызывайте их следующим образом:

 type myvar = function(parameter1,parameter2 /*etc */);
  

Метод класса — это функция, которая также является членом класса. Обычно он использует данные экземпляра для выполнения некоторой операции. Вы объявляете их следующим образом:

 class A
{
    public:

        type method(type parameter1, type parameter2);

};
  

определите их следующим образом:

 type A::method(type parameter1, type parameter2)
{
    return b*5;
}
  

и вызывайте их следующим образом:

 A myVar;
myVar.method(parameter1,parameter2);
  

Наконец, есть то, что предложил @phonetagger, а именно статические методы класса. Они похожи на обычные методы, но обычно не затрагивают данные экземпляра. Тем не менее, они обычно каким-то образом связаны с классом. Вы объявляете их следующим образом:

 class A
{
    public:

        static type method(type parameter1, type parameter2);

};
  

определите их следующим образом:

 type A::method(type parameter1, type parameter2)
{
    return b*5;
}
  

и вызывайте их следующим образом:

 A::method(parameter1,parameter2);
  

Вам нужно решить, какая из них вам действительно нужна, и правильно ее реализовать.

Комментарии:

1. Да, теперь это имеет смысл. Спасибо за ваш действительно информативный ответ. Мне очень помогло.