
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
![]() |
|
|
вот что за фигня у меня высвечивается? я в одной программе всё также сделал и всё пошло, а в этой уже ошибка... пишет: 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"); вот к примеру.. |
Сообщ.
#2
,
|
|
|
Цитата 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 и ворнинг мозолит глаза... |
Сообщ.
#3
,
|
|
|
используй strcpy_s, strncpy_s!
а вообще из текста варнинга все понятно ![]() |
Сообщ.
#4
,
|
|
|
всё правильно говоришь) я об этом тоже знаю, и просто я этот пример привёл неудачный)) на самом деле у меня вот как там дело то обстоит:
![]() ![]() // в заголовочном файле label обьявлен как указатель на char... label = new char[20]; strncpy(label , s2 , 19); label[19] = '\0'; // ну и что компилятору тут не нравится? |
Сообщ.
#5
,
|
|
|
Potroshitell
#pragma warning(disable:4996) |
Сообщ.
#6
,
|
|
|
Цитата Potroshitell @ // ну и что компилятору тут не нравится? ему все нравиться, он тебя просто предупреждает о том что использование strncpy может привести к проблемам, и даже приводит тебе пару выходов из этой ситуации, как ты поступишь дело твое, можешь отрубить этот ворнинг а можешь заменить свои две строчки: Цитата Potroshitell @ ![]() ![]() strncpy(label , s2 , 19); label[19] = '\0'; одной: ![]() ![]() strncpy_s(label, s2, 20); |
Сообщ.
#7
,
|
|
|
ок) хорошо, я с этим разобрался
![]() но вот ещё 1 проблема... он думает что обьект класса это указатель, хотя на самом деле это не так ![]() ![]() ... 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 &" существует, но недоступно |
Сообщ.
#8
,
|
|
|
Цитата Potroshitell @ Classic наследует Cd, всмысле Cd базовый класс... поидее он должен преобразовывать Classic в Cd в функции Bravo... но почему то он этого не делает... Чего то ты недоговариваешь, кусок кода где эти классы объявлены и используються покажи, и откуда у тебя взялсо "Classic *" |
Сообщ.
#9
,
|
|
|
![]() ![]() // 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 ![]() ![]() // реализация классика #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; } а базовый класс нужен? |
Сообщ.
#10
,
|
|
|
Преобразовываться ничего и никогда не должно.
![]() Если у тебя есть несколько наследников от одного базового, то передавай по указателю, а в самой функции либо идентифицируй объект, либо работай только с базовой составляющей, если этого достаточно. ![]() ![]() 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(); } } |
Сообщ.
#11
,
|
|
|
тьфу блин!!!
![]() |
Сообщ.
#12
,
|
|
|
дык...
Цитата Potroshitell @ class Classic : Cd Ты юзаешь закрытое наследование, напиши так: ![]() ![]() class Classic : public Cd { ... }; |