На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Strcpy и strncpy не робит...
    вот что за фигня у меня высвечивается? я в одной программе всё также сделал и всё пошло, а в этой уже ошибка... пишет: warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    я же вроди бы правильно её использую: strcpy(label , "none");
    вот к примеру..
      Цитата Potroshitell @
      warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.


      Цитата Potroshitell @
      я же вроди бы правильно её использую: strcpy(label , "none");


      У тебя ведь в описании ворнинга все написано!!!
      Во первых strcpy не проверяет размер буфера куда копирует, и длину строки откуда копирует, и может произойти переполнение буфера...
      Но судя по твоему ворнингу ты юзаешь strncpy она также небезопасна, т.к. не гарантируеться что она добавит в конец строки '\0', если его небыло в исходной, вот тебе компилятор и говорит, что ты можешь юзать либо безопасную версию этой функции strncpy_s, либо залести в настройки и отрубить этот варнинг командой _CRT_SECURE_NO_WARNINGS, если тебе нужно юзать именно функцию strncpy и ворнинг мозолит глаза...
        используй strcpy_s, strncpy_s!
        а вообще из текста варнинга все понятно ;)
          всё правильно говоришь) я об этом тоже знаю, и просто я этот пример привёл неудачный)) на самом деле у меня вот как там дело то обстоит:
          ExpandedWrap disabled
            // в заголовочном файле label обьявлен как указатель на char...
            label = new char[20];
            strncpy(label , s2 , 19);
            label[19] = '\0';
            // ну и что компилятору тут не нравится?
            Potroshitell
            #pragma warning(disable:4996)
              Цитата Potroshitell @
              // ну и что компилятору тут не нравится?

              ему все нравиться, он тебя просто предупреждает о том что использование strncpy может привести к проблемам, и даже приводит тебе пару выходов из этой ситуации, как ты поступишь дело твое, можешь отрубить этот ворнинг а можешь заменить свои две строчки:
              Цитата Potroshitell @

              ExpandedWrap disabled
                strncpy(label , s2 , 19);
                label[19] = '\0';

              одной:
              ExpandedWrap disabled
                strncpy_s(label, s2, 20);
                ок) хорошо, я с этим разобрался ;)
                но вот ещё 1 проблема... он думает что обьект класса это указатель, хотя на самом деле это не так
                ExpandedWrap disabled
                  ...
                  void Bravo (const Cd & obj);
                  int main()
                  {
                  Classic c2("Fantasia in C" , "Alfred Brendel" , 2 , 57.17 , "Philips");
                  Bravo(c2);
                  ...
                  }
                  void Bravo (const Cd & obj)
                  {
                  ...
                  }


                я кажется знаю в чём тут проблема... но как её решить? Classic наследует Cd, всмысле Cd базовый класс... поидее он должен преобразовывать Classic в Cd в функции Bravo... но почему то он этого не делает... может из-за того, что я забыл обьявить конструктор копирования?
                вот что пишет: error C2243: приведение типов: преобразование "Classic *" в "const Cd &" существует, но недоступно
                Сообщение отредактировано: Potroshitell -
                  Цитата Potroshitell @
                  Classic наследует Cd, всмысле Cd базовый класс... поидее он должен преобразовывать Classic в Cd в функции Bravo... но почему то он этого не делает...

                  Чего то ты недоговариваешь, кусок кода где эти классы объявлены и используються покажи, и откуда у тебя взялсо "Classic *"
                    ExpandedWrap disabled
                      // classic.h
                      #ifndef _CLASSIC_H_
                      #define _CLASSIC_H_
                       
                      #include "cd.h"
                       
                      class Classic : Cd
                      {
                      private:
                          char zadacha[40];
                      public:
                          Classic(char * s1, char * s2, int n, double x, char * zad);
                          Classic();
                          virtual void report() const;
                          virtual ~Classic();
                      };
                       
                      #endif


                    ExpandedWrap disabled
                      // реализация классика
                      #include <iostream>
                      using namespace std;
                      #include <cstring>
                      #include "cd.h"
                      #include "Classic.h"
                       
                      Classic::Classic(char * s1, char * s2, int n, double x, char * zad) : Cd(s1, s2, n, x)
                      {
                          strncpy(zadacha ,zad, 39);
                          zadacha[39] = '\0';
                      }
                       
                      Classic::Classic() : Cd()
                      {
                          strcpy(zadacha, "none");
                      }
                       
                      Classic::~Classic() { }
                       
                      void Classic::report() const
                      {
                          Cd::report();
                          cout << " Zadacha = " << zadacha << endl;
                      }


                    а базовый класс нужен?
                      Преобразовываться ничего и никогда не должно. :)
                      Если у тебя есть несколько наследников от одного базового, то передавай по указателю, а в самой функции либо идентифицируй объект, либо работай только с базовой составляющей, если этого достаточно.

                      ExpandedWrap disabled
                        class A {
                            public:
                                void foo() const;
                        };
                         
                         
                        class B : public A {
                            public:
                                void bar() const;
                        };
                         
                        void g(const A* a) {
                            B* b;
                            a->foo();
                         
                            if(b = dynamic_cast<B*>(a)) {
                                b->bar();
                            }
                        }
                        тьфу блин!!! :D ппц я тупанул)) я в class Classic : public Cd, забыл слово public)) теперь всё норм работает) спс вам)
                          дык...
                          Цитата Potroshitell @
                          class Classic : Cd

                          Ты юзаешь закрытое наследование, напиши так:
                          ExpandedWrap disabled
                            class Classic : public Cd
                            {
                            ...
                            };
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0504 ]   [ 16 queries used ]   [ Generated: 15.06.25, 03:08 GMT ]