Я получаю эту проблему в компиляции C++ задач в Ubuntu g ++ версия 4.4.3. Я не знаю, что заголовки включают для решения этой проблемы.. Спасибо
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);
Наблюдения:
#include
должен ввести std :: strcpy (). с использованием пространства имен std;
(как написано в medico.h) вводит любые идентификаторы из std ::
в глобальное пространство имен. Помимо использования пространства имен std;
несколько неуклюжие, когда приложение становится больше (поскольку оно вводит чертовски много идентификаторов в глобальное пространство имен), и что вы не должны никогда использование с использованием
в файле заголовка (см. ниже!), с использованием пространства имен
не влияет на идентификаторы, введенные после оператора.
( с использованием пространства имен std
записано в заголовке, который включен в medico.cpp, но #include
идет после этого.)
Мой совет: Поместите using namespace std;
в medico.cpp, после любого include и используйте явный std ::
в medico .час.
strcmpi ()
вообще не является стандартной функцией; будучи определенным в Windows, вы должны решать нечувствительные к регистру сравнения по-разному в Linux.
(В общих чертах я хотел бы указать на этот ответ в отношении «правильной» обработки строк в C и C ++, которая учитывает Unicode, как и должно быть каждое приложение. Резюме: Стандарт не может обрабатывать эти вещи правильно; используйте ICU .)
warning: deprecated conversion from string constant to ‘char*’
«Строковая константа» - это когда вы пишете строковый литерал (например, «Привет "
) в вашем коде.Его тип - const char []
, то есть массив константных символов (поскольку вы не можете изменять символы). Вы можете назначить массив указателю, но присвоение char *
, то есть удаление квалификатора const
, генерирует предупреждение, которое вы видите.
Уточнение OT: использование
в файле заголовка изменяет видимость идентификаторов для всех, включая этот заголовок, что обычно не то, чего хочет пользователь вашего файла заголовка. Например, я мог бы использовать std :: string
и самописный :: string
просто идеально в моем коде, , если я не включу ваш medico.h , потому что тогда два класса столкнутся.
Не используйте , используя
в файлах заголовков.
Когда вы говорите:
#include <cstring>
компилятор g ++ должен поместить объявления
, которые он сам включает в ] std ::
И глобальные пространства имен. По какой-то причине кажется, что он этого не делает. Попробуйте заменить один экземпляр strcpy
на std :: strcpy
и посмотрите, решит ли это проблему.