Не объявлено в этой области ошибка для функции - PullRequest
1 голос
/ 06 марта 2019

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

Ошибка от g ++: «ошибка: 'convert' не была объявлена ​​в этой области»

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

Ах:

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

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

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

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

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

Будет ли у вас экземпляриз class A?Если это так, скажем, вы называете это "Фред", то вы можете позвонить 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;
}
1 голос
/ 07 марта 2019

Вы путаете 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, это Static Class Methods. Это как обычные методы, но обычно не затрагивают данные экземпляра. Тем не менее, они обычно связаны с классом в некотором роде. Вы объявляете их так:

class A
{
    public:

        static type method(type parameter1, type parameter2);

};

определите их так:

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

и назовите их так:

A::method(parameter1,parameter2);

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

...