Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статические члены и наследование 
:(
    Опции темы
Anton Vatchenko
Дата 28.8.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Очень необходимо реализовать то, что по принципу джавы могло бы писаться как:
Код

class A {

public:
    static char visible = 1;
};

class B : public A {

public:
    static char visible = 0;
};

class C : public A {

};

A a;
a.visible - 1
B b;
b.visible - 0
C C;
c.visible - 1


Это сообщение отредактировал(а) Anton Vatchenko - 28.8.2008, 15:14


--------------------
user posted image
PM MAIL   Вверх
W4FhLF
Дата 28.8.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Код

class A 
{
public:
    char visible;

    A():
      visible(1)
    {};
};

class B : public A 
{
public:
    static char visible;

    B() {};
};

class C : public A 
{
public:
    C() {};
};

char B::visible = 0;

int main()
{
    A a;
    B b;
    C c;

    return 0;
}


Добавлено через 1 минуту и 2 секунды
Только непонятно зачем данные-члены делать public. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Anton Vatchenko
Дата 28.8.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Пардон, забыл статик в первом классе... А публичные - чтобы видеть извне.


--------------------
user posted image
PM MAIL   Вверх
Alek86
Дата 28.8.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Anton Vatchenko @  28.8.2008,  15:14 Найти цитируемый пост)
 А публичные - чтобы видеть извне.

это и есть принципы джавы? smile

небольшая "лекция"
в любом ООП языке не рекомендуется делать переменные-члены публичными
если нужно - сделай функции геттер и сеттер для нужных переменных
а если уж совсем ООП следовать, то переменные - это часть реализации и юзер класса вообще не должен знать о их существавонии и работать только через функции (для того в джаве интерфейсы и ввели)


--------------------
user posted image    user posted image
PM MAIL   Вверх
W4FhLF
Дата 28.8.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Вообще, лучше бы уточнить, чего конкретно ты хочешь добиться. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Anton Vatchenko
Дата 28.8.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Вообще в любом ооп по лекциям требуется писать так, чтобы было красиво и медленно. Есть места, где такого делать не стоит (не все же сводится к офисным приложениям).

А требуется делать так, чтобы у меня были объекты N разных типов (у меня N классов). Некоторые объекты visible, некоторые нет (ясно что visible относится к классам, поэтому если объекты относятся к одному классу, они все видимые скажем). Большинство видимые, поэтому главный класс visible = 1, и лишь в некоторых visible = 0.

Чтобы потом экземпляр.visible возвращал правильные значения.


--------------------
user posted image
PM MAIL   Вверх
W4FhLF
Дата 28.8.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(Anton Vatchenko @  28.8.2008,  15:44 Найти цитируемый пост)
Есть места, где такого делать не стоит (не все же сводится к офисным приложениям).


Т.е. ты утверждаешь, что если сделать все данные-члены открытыми, то приложение будет работать быстрее? Ты не прав. Простейшие геттеры заменяются прямым обращение самим компилятором при оптимизации по скорости. К тому же есть inline. 


Цитата(Anton Vatchenko @  28.8.2008,  15:44 Найти цитируемый пост)
А требуется делать так, чтобы у меня были объекты N разных типов (у меня N классов). Некоторые объекты visible, некоторые нет (ясно что visible относится к классам, поэтому если объекты относятся к одному классу, они все видимые скажем). Большинство видимые, поэтому главный класс visible = 1, и лишь в некоторых visible = 0.


Здесь нельзя использовать static-данные. Они ведь общие для всех объектов. Скажем, будет у тебя 9 видимых объектов класса A, один ты решишь сделать невидимым, обнулив переменную visible. В итоге получишь, что все объекты, так или иначе, связанные с этой переменной станут невидимыми.

Создай простой флаг visible типа bool, размести его в private секции и работай как обычно. Что тебя смущает то?

Это сообщение отредактировал(а) W4FhLF - 28.8.2008, 16:08


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Anton Vatchenko
Дата 28.8.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Так я ж сказал что все объекты одного типа либо видимые, либо нет. Другими словами изначально (то есть const) известно, что (возьму пример уже свой) косяк рыбы невиден для игрока (так как под водой), а дерево видимое. Ну хоть косяки окуней, хоть лосося, хоть в море хоть в реке - они все РЫБА, и они невидимые, а деревья хоть дуб хоть еще что-то - все ДЕРЕВЬЯ, и они видимые.


--------------------
user posted image
PM MAIL   Вверх
Lycifer
Дата 28.8.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Цитата

это и есть принципы джавы? smile

небольшая "лекция"
в любом ООП языке не рекомендуется делать переменные-члены публичными
если нужно - сделай функции геттер и сеттер для нужных переменных
а если уж совсем ООП следовать, то переменные - это часть реализации и юзер класса вообще не должен знать о их существавонии и работать только через функции (для того в джаве интерфейсы и ввели)


Интерестно кто такое сказал что "не рекомендуется", стандарт С++?
вообще давайте подумаем почему член класса делать public не гуд
 - Пользователь класса может изменить содержание членов класса, и не более того, так вот 
Anton Vatchenko , привел пример где пользователь менят содержимое поля класса (visible) что в этом плохого?
Может быть потому что он не делал вызов функции? smile 
PM MAIL ICQ   Вверх
Alek86
Дата 28.8.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Lycifer @  28.8.2008,  16:14 Найти цитируемый пост)
Интерестно кто такое сказал что "не рекомендуется"

кроме стандарта есть еще куча литературы от неглупых людей + собственный опыт
заново объяснять, чем хороша инкапсуляция, не очень хочется
достаточно доступно объяснено в Новых сложных задачах на C++ Саттера (задача 17)


--------------------
user posted image    user posted image
PM MAIL   Вверх
Anton Vatchenko
Дата 28.8.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Люди, не спорьте. Просто объясните как реализовать то, что я указал.


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 28.8.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lycifer @  28.8.2008,  16:14 Найти цитируемый пост)
вообще давайте подумаем почему член класса делать public не гуд

Так уже тысячу раз об этом передумано..
Объект должен сам руководить своими внутреннеми процессами, а не полагаться на внешнее управление. 
Открытые переменные говорят об незакончености объекта.  Кастати объект состояших из Гетеров и Сеттеров тоже плох. 
В таком случае он объект, а блок данных.  Даже просто поняв разницу между двумя последними понятиями , можно почуствовать проблему открытых членов.
А сводится все к тому что, если реализация класса выполнена приватно, то все связи находятся в одной локальной области и легки для проверки и контроля.
Если объект предоствляет открытый доступ к реализации, то она расползается по всему коду программы и любая модификация исходника с каждым таким шагом сильно затрудняется... И не только модификация, но и просто понимание проги.
ООП чем и хорош что предполагает что каждый объект можно протестировать(и понять) без участия остальных.
Естественно , чем меньше  связей тем легче .. 




--------------------
PM MAIL WWW   Вверх
W4FhLF
Дата 28.8.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(Anton Vatchenko @  28.8.2008,  16:13 Найти цитируемый пост)
Так я ж сказал что все объекты одного типа либо видимые, либо нет. Другими словами изначально (то есть const) известно, что (возьму пример уже свой) косяк рыбы невиден для игрока (так как под водой), а дерево видимое. Ну хоть косяки окуней, хоть лосося, хоть в море хоть в реке - они все РЫБА, и они невидимые, а деревья хоть дуб хоть еще что-то - все ДЕРЕВЬЯ, и они видимые.


Ну ок. Делай несколько базовых классов(рыба, дерево), которые хранят static-флаг visible. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alek86
Дата 28.8.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Anton Vatchenko @  28.8.2008,  16:27 Найти цитируемый пост)
Люди, не спорьте. Просто объясните как реализовать то, что я указал.

виртуальная ф-я  IsVisible

Код

class A {
public:
    virtual bool IsVisible() { return true; }
};

class B : public A {

public:
    virtual bool IsVisible() { return false; }
};

class C : public A {
    virtual bool IsVisible() { return true; }
};



--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 28.8.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Anton Vatchenko @  28.8.2008,  15:44 Найти цитируемый пост)
Вообще в любом ооп по лекциям требуется писать так, чтобы было красиво и медленно. 

Нет.. глядеть надо не стороны лекций, а со сторны инструментария предоставляемго языком.. ООП помогает писать так, чтоб это было красиво, понятно и при этом без ушерба в скорости...
Например казалось бы что программа написанная в машиных кодах будет работаь быстрей, чем такая же прога на Си,
однако зачастую наблюдается обратная ситуация.. Потому что чтоб выйграть в скорости при писании в маешинах кодах, надо знать архитектура компа  и сопотимизировать под нее свою лучше, чем это сделает компилятор..(а сравниться с компиляторами, особенно заточенными под нужную платформу, смогут лишь единицы). То же происходит если сравнить С и Сpp.. При компиляции весь ооп разворачивается и в результате имеем тот же си код . Зато при составлении, инструментарий ООП позволяет значительно снизить нагрузку с программиста, если он правильно его использует.
То есть имеем те же пряники, но за меньшее время и с меньшей головной болью..

Добавлено через 2 минуты и 41 секунду
Цитата(Anton Vatchenko @  28.8.2008,  16:27 Найти цитируемый пост)
Люди, не спорьте. Просто объясните как реализовать то, что я указал. 

Цитата(Anton Vatchenko @  28.8.2008,  14:52 Найти цитируемый пост)
Очень необходимо реализовать то, что по принципу джавы могло бы писаться как:

нельзя ли объяснить что именно Вы хотите..
потому как например в этой строчке
Цитата(Anton Vatchenko @  28.8.2008,  14:52 Найти цитируемый пост)
a.visible - 1

найти смысл очень сложно ... 


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.