#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()
» функцию, которую вы пытаетесь вызвать. Есть несколько способов сделать это:
- Для нестатической функции-члена класса (обычно называемой «методом», когда она является частью класса) вам сначала понадобится объект типа этого класса, чтобы вызвать метод.
- Для статических функций-членов класса (обычно называемых «статическими методами») вы можете вызвать ее, используя объект этого типа, чтобы разрешить область видимости, или, поскольку это статический метод, вы можете использовать имя класса (вместе с
::
оператором разрешения области видимости) для разрешения области видимости. - Если у вас есть «свободная функция», которая определена в отдельном пространстве имен, которое не охватывает область, в которой вы пытаетесь вызвать функцию, вам нужно будет использовать либо
::
оператор разрешения области видимости (например, «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 вещи:
- Функции
- Методы-члены класса
- Методы статического класса
Функция — это набор команд, которые должны выполняться подряд. Вы объявляете их следующим образом:
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. Да, теперь это имеет смысл. Спасибо за ваш действительно информативный ответ. Мне очень помогло.