32

この問題は、Ubuntug++バージョン4.4.3でコンパイルするc++の問題で発生します。この問題を解決するために含めるヘッダーがわかりません。ありがとうございます。

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);
4

3 に答える 3

49

観察:

  • #include <cstring>std :: strcpy()を導入する必要があります。
  • using namespace std;(medico.hで記述されているように)からstd::の識別子をグローバル名前空間に導入します。

using namespace std;アプリケーションが大きくなると(グローバル名前空間に多くの識別子が1つ導入されるため)やや不器用であり、ヘッダーファイルで使用してはならないことusing(以下を参照)を除けば、その後using namespace導入される識別子には影響しません。声明。

using namespace stdmedico.cppに含まれているヘッダーに書き込まれますが、#include <cstring>その後に続きます。)

私のアドバイス:(using namespace std;使用することを主張する場合は)インクルードのに​​medico.cppに入れ、medico.hでexplicitを使用std::します。


strcmpi()標準機能ではありません。Windowsで定義されている間、Linuxでは大文字と小文字を区別しない比較を異なる方法で解決する必要があります。

(一般的に、すべてのアプリケーションがそうであるように、Unicodeを考慮したCおよびC ++での「適切な」文字列処理に関してこの答えを指摘したいと思います。要約:標準はこれらを正しく処理できません。ICUを使用してください。 )。


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

「文字列定数」とは"Hello"、コードに文字列リテラル(例)を記述する場合です。そのタイプは、つまり、定数const char[]文字の配列です(文字を変更できないため)。配列をポインタに割り当てることはできますが、に割り当てる、つまり修飾子を削除すると、表示されている警告が生成されます。char *const


OTの明確化:usingヘッダーファイルでは、そのヘッダーを含むすべてのユーザーの識別子の可視性が変更されます。これは通常、ヘッダーファイルのユーザーが望んでいるものではありません。たとえば、medico.hを含めない限り、コードで完全に自分でstd::string記述したものを使用できます。そうすると、2つのクラスが衝突するからです。::string

usingヘッダーファイルでは使用しないでください。

また、実装ファイルでも、多くのあいまいさが生じる可能性があります。実装ファイルでも明示的な名前空間を使用する場合があります。

于 2010-02-08T10:35:34.387 に答える
3

あなたが言う時:

 #include <cstring>

g ++コンパイラは、<string.h>それ自体に含まれる宣言をstd::ANDグローバル名前空間に入れる必要があります。なんらかの理由でそれをしていないように見えます。strcpyの1つのインスタンスをに置き換えてみてstd::strcpy、問題が解決するかどうかを確認してください。

于 2010-02-08T10:31:21.877 に答える
0

このエラーは、次のような状況で発生することがあります。

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

次のコード行が実行時に実行されない場合:

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

次のようなコードのエラーに直面します。initstatestdlib.hファイルに配置されており、含まれていないためです。

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
于 2013-09-04T07:33:59.020 に答える