Error en código basico c++. “Nombredelavariable” was not declared in this scope

publicado por: Anonymous

Estoy aprendiendo C++ y el error que me aparece en Eclipse es:

“Nombredelavariable” was not declared in this scope

En el documento.h tengo declarado la variable m_nomLocal, así que no sé a qué puede referirse.

En el archivo .h declaro algunas funciones y las variables:

#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

Y en el .cpp las defino tal que:

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

solución

"Nombredelavariable" was not declared in this scope

El error, concretamente te indica que la variable llamada Nombredelavariable no existe en el ámbito en que está siendo usada. Se que es una perogrullada pero es importante remarcarlo para entender el error.

Vayamos pues, paso por paso. Usaré la variable m_nomLocal como ejemplo, pero es aplicable a las demás.

… in this scope.

En este ámbito. ¿A qué se refiere? Veamos el uso de m_nomLocal:

CCadena GetLocal()
{
    return m_nomLocal; // m_nomLocal not declared in this scope
}

Sabemos que m_nomLocal forma parte de la clase CPartit y sabemos que GetLocal es una función miembro de dicha clase, así que este código debería funcionar ¿no?.

Lo cierto es que no. Porque la función GetLocal que acabamos de ver no forma parte de CPartit si no que va por libre. En otras palabras el ámbito de GetLocal es el ámbito global. Si queremos que forme parte del ámbito de la clase CPartit debemos anteponer el ámbito de la clase al nombre de la función:

CCadena CPartit::GetLocal()
{
    return m_nomLocal;
}

Con la modificación anterior, hemos añadido la función GetLocal al ámbito de la clase CPartit.

… was not declared…

No ha sido declarada. ¿A qué se refiere? Si tenemos una función del ámbito global:

CCadena GetLocal()
{
    return m_nomLocal;
}

Ésta sólo podrá acceder a funciones del mismo ámbito o ámbitos menos restrictivos. Dado que el ámbito global es el ámbito menos restrictivo de todos no podrá acceder más que a variables del ámbito global.

La variable m_nomLocal no pertenece al ámbito global si no que pertenece al ámbito de CPartit, dicho de otra manera: el nombre completo de la variable sería CPartit::m_nomLocal y en consecuencia no existe (no ha sido declarada) ninguna variable con el nombre m_nomLocal en el ámbito global.

Otro ejemplo

// Variable en ambito global.
CCadena m_nomLocal;

// Función de ambito global.
CCadena GetLocal()
{
    // Acceso a la variable global 'm_nomLocal'.
    return m_nomLocal;
}

// Función en ambito 'CPartit'.
CCadena CPartit::GetLocal()
{
    // Acceso a la 'm_nomLocal' del ámbito 'CPartit'.
    return m_nomLocal;
}

Vemos que aunque tenemos dos variables con el mismo nombre (m_nomLocal) cada función accede a diferentes variables porque cada una de las funciones pertenece a un ámbito distinto, puedes ver el ejemplo en funcionamiento aquí.

Como "curiosidad", si quisieras acceder a m_nomLocal global desde el ámbito de CPartit deberías referirte a la variable como ::m_nomLocal.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *