Я изучаю С++ , и в Eclipse появляется ошибка :
«Имя переменной» не было объявлено в этой области.
В document.h у меня объявлена переменная m_nomLocal
, поэтому я не знаю, на что она может ссылаться.
В файле .h я объявляю некоторые функции и переменные:
#ifndef PARTIT_H
#define PARTIT_H
#include <iostream>
using namespace std;
#include "cadena.h"
class CPartit {
public:
CCadena GetLocal();
CCadena GetVisitant();
int GetPuntsLocal();
int GetPuntsVisitant();
private:
int m_puntsLocal;
int m_puntsVisitant;
int m_puntsTotal;
CCadena m_nomLocal;
CCadena m_nomVisitant;
int partit;
};
#endif
И в .cpp я определяю их так, что:
#include <iomanip>
using namespace std;
#include "partit.h"
CCadena GetLocal()
{
return m_nomLocal;
}
CCadena GetVisitant()
{
return m_nomVisitant;
}
int GetPuntsLocal()
{
return m_puntsLocal;
}
int GetPuntsVisitant()
{
return m_puntsVisitant;
}
Ошибка конкретно сообщает вам, что вызываемая переменная
Nombredelavariable
не существует в той области, в которой она используется. Я знаю, что это трюизм, но важно указать на него, чтобы понять ошибку.Итак, давайте шаг за шагом. Я буду использовать эту переменную
m_nomLocal
в качестве примера, но она применима и к другим.... в этом диапазоне.
В этой сфере. Что ты имеешь в виду? Давайте посмотрим на использование
m_nomLocal
:Мы знаем, что это
m_nomLocal
часть классаCPartit
, и мы знаем, чтоGetLocal
это функция-член этого класса, поэтому этот код должен работать правильно?Правда в том, что нет. Поскольку функция
GetLocal
, которую мы только что видели, не является ее частьюCPartit
, она свободна. Другими словами, областью действияGetLocal
является глобальная область. Если мы хотим, чтобы это было частью области видимости класса,CPartit
мы должны добавить область действия класса перед именем функции:С приведенной выше модификацией мы добавили функцию
GetLocal
в область видимости классаCPartit
....не заявлено...
Это не было объявлено. Что ты имеешь в виду? Если у нас есть функция глобальной области видимости:
Это позволит получить доступ только к функциям той же или менее ограничительной области. Поскольку глобальная область является наименее ограничивающей из всех областей, вы сможете получить доступ к переменным только в глобальной области.
Переменная
m_nomLocal
не принадлежит глобальной области видимости, а принадлежит области действияCPartit
, другими словами: полное имя переменной было быCPartit::m_nomLocal
и, следовательно, в глобальной области видимости нет переменной с таким именемm_nomLocal
(она не была объявлена).Другой пример
Мы видим, что хотя у нас есть две переменные с одинаковыми именами (
m_nomLocal
), каждая функция обращается к разным переменным, поскольку каждая из функций принадлежит разным областям видимости, вы можете увидеть пример в действии aquí.Как « любопытство », если вы хотите получить доступ к
m_nomLocal
глобальному из области видимости,CPartit
вы должны ссылаться на переменную как::m_nomLocal
.Представьте, что вам нужно модифицировать код вашего коллеги и вы нашли такую функцию, что:
Какую информацию можно получить из этого кода? Выводы, к которым я пришел, заключаются в том, что это
func
свободная функция (она не принадлежит ни к какому классу) и что онаvariable
должна быть статической переменной (поскольку функция не принадлежит ни к какому классу).Ну точно так же будет и с компилятором и при поиске
variable
в списке статических переменных он его не найдет и покажет вам соответствующую ошибку.Чтобы компилятор знал, что это
func
функция-член класса, вы должны указать это, добавив имя указанного класса:Теперь компилятор поймет, что это
func
функция-членMiClase
, иvariable
теперь он может быть членомMiClase
или (если у него нетMiClase
именованных переменных) статической переменной.В вашем случае функции должны выглядеть так:
Я знаю, что с тобой происходит, мой друг! Это ошибка, которая случалась со мной время от времени. вы говорите в partit.h я определяю переменную
m_nomLocal
. и когда я использую его в partit.cpp , он говорит мне , что он не определен , так что же происходит?Ну бывает, когда вы вызываете переменную
m_nomLocal
из файла partit.cpp , вы предполагаете, что компилятор понимает, что это часть классаCPartit
, потому что вы включили файл partit.h в заголовок, но это не так. вы должны четко сказать, что функция принадлежит классуCPartit
это похоже на то, что происходит с функциями, принадлежащими
std
какstd::cout
или иstd::endl
т. д., и что для того, чтобы избежать этого во всей программе, напишите вышеusing namespace std
, я надеюсь, что это решит вашу проблему