2010-02-08 37 views
21

Aparece este problema en un problema de C++ compilando en Ubuntu g ++ versión 4.4.3. que no sé las cabeceras de incluir a solucionar este problema .. Graciaserror: strcpy no se declaró en este ámbito

centro_medico.cpp: In constructor ‘Centro_medico::Centro_medico(char*, char*, int, int, float)’: 
centro_medico.cpp:5: error: ‘strcpy’ was not declared in this scope 
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’ 
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’ 
centro_medico.cpp: In member function ‘Centro_medico& Centro_medico::operator=(const Centro_medico&)’: 
centro_medico.cpp:26: error: ‘strcpy’ was not declared in this scope 
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’ 
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’ 
centro_medico.cpp: In member function ‘bool Centro_medico::quitar_medico(int)’: 
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’ 
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’ 
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_especialidades(std::ostream&) const’: 
centro_medico.cpp:123: error: ‘strcmpi’ was not declared in this scope 
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_horarios_consulta(char*) const’: 
centro_medico.cpp:162: error: ‘strcmpi’ was not declared in this scope 
centro_medico.cpp: In member function ‘void Centro_medico::crea_medicos()’: 
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’ 
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’ 

medico.cpp

#include "medico.h" 
#include <cstdlib> 
#include <iostream> 
#include <stdlib> 
#include<cstring> 
#include<string> 

long Medico::total_consultas=0; 
Medico::Medico(char *nom,char * espe,int colegiado,int trabajo) 
{ 
int i; 
strcpy(nombre,nom); 
strcpy(especialidad,espe); 
num_colegiado=colegiado; 
num_horas_diarias=trabajo; 
citas_medico= new Cita*[5]; // 5 Días de las semana, de Lunes a Viernes. 
for (i=0;i<5;i++) 
citas_medico[i]=new Cita[num_horas_diarias]; 
} 



Medico::Medico(const Medico &m){ 
    int i; 
    citas_medico=new Cita*[5]; 
    for (i=0;i<5;i++) 
    citas_medico[i]=NULL; 
(*this) = m; 
} 

Medico &Medico::operator=(const Medico &m){ 
int i,j; 
if (this != &m) { // Para evitar la asignación de un objeto a sí mismo 
    strcpy(nombre,m.nombre); 
    strcpy(especialidad,m.especialidad);  
    num_colegiado=m.num_colegiado; 
    num_horas_diarias=m.num_horas_diarias; 
    for (i=0;i<5;i++){ 
     delete citas_medico[i]; 
     citas_medico[i]=new Cita[num_horas_diarias]; 
     for(j=0;j<num_horas_diarias;j++){ 
     citas_medico[i][j] = m.citas_medico[i][j] ; 
     } 
    }  
    } 
return *this; 
} 

medico.h

#pragma once 
#include <cstdlib> 
#include <iostream> 
using namespace std; 
#include "cita.h" 

class Medico 
{ 
private: 
       char nombre[50]; 
       char especialidad[50]; 
       int num_colegiado; 
       int num_horas_diarias; 
       Cita **citas_medico; 
       static long total_consultas;     
public: 
       void mostrar_calendario_citas(ostream &o=cout) const; 
       bool asignar_cita(int d, int hor,Paciente *p=NULL); 
       void anular_cita(int d, int hor); 
       bool consultar_cita(char dni[10], int modificar=0); 
       void modificar_cita(int d, int hor);     
       void vaciar_calendario_citas(); 
       void borrar_calendario_citas();     
       char* get_especialidad(char espec[50]) const; 
       char* get_nombre(char n[50]) const; 
       int get_num_colegiado() const; 
       int get_num_horas() const; 
       void set_num_horas(int horas); 
       void mostrar_info(ostream &o=cout) const; 
       static long get_total_consultas(); 
       Cita* operator[](int dia); 
       void eliminar_calendario_citas(); 
       void crear_calendario_citas();  
       Medico(char *nom,char * espe,int colegiado,int trabajo); 
       Medico(const Medico &m); 
       Medico &operator=(const Medico &c); 
       void operator delete(void*); 
       ~Medico(); 
}; 
ostream& operator<<(ostream &o, Medico &c); 
ofstream& operator<<(ofstream &fichero, Medico &m); 
ifstream& operator>>(ifstream &fichero, Medico &m); 
+2

¿Qué pasa con el '# include' abuso? –

+1

por favor reformate tu código, eliminando todos los espacios en blanco verticales innecesarios –

+0

Me parece una tarea – Manuel

Respuesta

37

Observaciones:

  • #include <cstring> debería introducir std :: strcpy().
  • using namespace std; (como está escrito en medico.h) introduce cualquier identificador de std:: en el espacio de nombres global.

Aparte de using namespace std; siendo algo torpe vez que la aplicación se hace más grande (ya que introduce un infierno de un montón de identificadores en el espacio de nombres global), y que usted debe Nunca uso using en un fichero de cabecera (véase más adelante !), using namespace no afecta a los identificadores introducidos después de la declaración.

(using namespace std está escrito en la cabecera, que se incluye en medico.cpp, pero #include <cstring> viene después de eso.)

Mi consejo: Coloque el using namespace std; en medico.cpp, después de cualquier incluye, y use explícitamente std:: en medico.h.


strcmpi() no es una función estándar en absoluto; mientras se define en Windows, tiene que resolver las diferencias entre mayúsculas y minúsculas y se compara de forma diferente en Linux.

(En términos generales, me gustaría señalar a this answer con respecto a la cadena "adecuada" de manipulación en C y C++ que toma Unicode en cuenta, ya que cada aplicación debe Resumen:. El estándar no puede manejar estas cosas correctamente ; hacer uso ICU)


warning: deprecated conversion from string constant to ‘char*’ 

una "cadena constante" es cuando se escribe una cadena literal (por ejemplo "Hello") en el código..Su tipo es const char[], es decir, una matriz de caracteres constantes (ya que no puede cambiar los caracteres). Puede asignar una matriz a un puntero, pero asignar a char *, es decir, eliminar el calificador const, genera la advertencia que está viendo.


OT aclaración: using en un fichero de cabecera cambia la visibilidad de los identificadores para cualquier persona incluyendo la cabecera, que por lo general no es lo que el usuario de su archivo de cabecera quiere. Por ejemplo, podría usar std::string y un autocompuesto ::string perfectamente en mi código, a menos que incluya su medico.h, porque entonces las dos clases entrarán en conflicto.

No utilice using en archivos de encabezado.

+0

Gracias, creo que o resolver el problema de error: 'strcmpi' no se declaró en este ámbito Me aparece otra advertencia: advertencia: conversión obsoleta de cadena constante a 'char *' – Chak

+1

Lo siento, no lo hice ver los otros dos tipos de advertencia. Por lo general, solo corrijo el primer error antes de volver a compilar, ya que a menudo muchos de los siguientes errores/advertencias son seguimientos que desaparecen una vez que se resuelve el problema más elevado. Extendí mi respuesta para cubrir los otros dos casos. – DevSolar

+0

¡¡¡Te gusta mucho !!! ¡muy útil! – Chak

1

Cuando decir:

#include <cstring> 

el compilador g ++ debe poner los <string.h> declaraciones que sí incluye en el std:: Y los espacios de nombres globales. Por alguna razón, parece que no está haciendo eso. Intente reemplazar una instancia de strcpy con std::strcpy y vea si eso soluciona el problema.

+0

No es correcto. '' * does * pone las declaraciones en 'std ::', pero si las pone también en el espacio de nombres global depende de la implementación. No estoy seguro si el estándar incluso permite ponerlos en global, pero estoy seguro de que no * lo * requiere. – DevSolar

+0

Lo permite, actualmente no lo requiere, y el comportamiento del que estaba hablando era el de g ++. En mi instalación (versión 4.4.1) hace lo que dije. –

+0

Lo siento, soy un poco anal-retentivo cuando se trata de los estándares de idioma. ;-) – DevSolar

0

Este error ocurre a veces en una situación como esta:

#ifndef NAN 
#include <stdlib.h> 
#define NAN (strtod("NAN",NULL)) 
#endif 

static void init_random(uint32_t initseed=0) 
{ 
    if (initseed==0) 
    { 
     struct timeval tv; 
     gettimeofday(&tv, NULL); 
     seed=(uint32_t) (4223517*getpid()*tv.tv_sec*tv.tv_usec); 
    } 
    else 
     seed=initseed; 
#if !defined(CYGWIN) && !defined(__INTERIX) 
    //seed=42 
    //SG_SPRINT("initializing random number generator with %d (seed size %d)\n", seed, RNG_SEED_SIZE) 
    initstate(seed, CMath::rand_state, RNG_SEED_SIZE); 
#endif 
} 

Si las siguientes líneas de código se ejecutan en el tiempo de ejecución:

#ifndef NAN 
#include <stdlib.h> 
#define NAN (strtod("NAN",NULL)) 
#endif 

que se enfrentarán con un error en el código como algo de la siguiente manera; porque initstate se coloca en el stdlib.h archivo y no está incluido:

In file included from ../../shogun/features/SubsetStack.h:14:0, 
       from ../../shogun/features/Features.h:21, 
       from ../../shogun/ui/SGInterface.h:7, 
       from MatlabInterface.h:15, 
       from matlabInterface.cpp:7: 
../../shogun/mathematics/Math.h: In static member function 'static void shogun::CMath::init_random(uint32_t)': 
../../shogun/mathematics/Math.h:459:52: error: 'initstate' was not declared in this scope 
Cuestiones relacionadas