我正在学习C++ , Eclipse中出现的错误是:
“VariableName”未在此范围内声明
在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
从你的范围内访问 global,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
likestd::cout
或std::endl
etc 的函数所发生的情况。为了避免在上面写的整个程序中这样做,using namespace std
我希望能解决你的问题