Повреждение данных в защищенном доступе в C ++ - PullRequest
0 голосов
/ 30 января 2009

Переменные "защищен" подвержены вредоносному изменению производным классом? Должен ли я использовать «private» в переменных базового класса вместо «protected»?

Ответы [ 5 ]

10 голосов
/ 30 января 2009

Если вы беспокоитесь о «злонамеренных» модификациях, то даже пометка данных как private: не поможет.

Спецификаторы доступа C ++ полезны только для кода, который по сути воспроизводится по правилам.

Пометка участника как private не позволит обычным пользователям вашего класса связываться с ними. Тем не менее, даже не злонамеренный код, имеющий ошибки, может повредить этих участников. Переполнения, арифметика с ошибочными указателями или неправильное использование приведения позволяют программисту C ++ вызывать эти проблемы.

2 голосов
/ 30 января 2009

«Вредоносный» доступ не может быть предотвращен в C ++, потому что вы всегда можете как-то обойти ограничения компилятора. Если вы беспокоитесь о «случайных» изменениях, сделайте это приватным.

1 голос
/ 30 января 2009

Ну, защищенные члены получают по наследству. Если вы не хотите, чтобы это произошло, сделайте их приватными .

0 голосов
/ 30 января 2009

В общем, если вы планируете объявить личную переменную, вам следует отступить и спросить себя, почему вы даже публикуете объявление в заголовочном файле?

вместо того, чтобы выставлять ваши переменные-члены для всего мира, чтобы увидеть в foo.h:

class foo {
private:
    int    please_dont_modify_me;
    double pretend_you_dont_see_this_declaration;
    char   dont_look_at_this [128];
public:
    ....
};

просто используйте неполный закрытый тип, то есть не , определенный:

class foo {
    struct foo_privates & mine;   // incomplete type
public:
    ...
};

затем в foo.cpp ТОЛЬКО :

struct foo_privates {
     int    i;
     double d;
     char   str[128];
}; 

Конечно, конструктор для foo должен выделить отдельный объект, а деструктор должен уничтожить его.

0 голосов
/ 30 января 2009

Взгляните на: http://www.parashift.com/c++-faq-lite/private-inheritance.html#faq-24.5

Вы, вероятно, хотите приват.

...