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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> статическое свойство класса-наследника 
:(
    Опции темы
46&two
Дата 8.6.2004, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код
class parent {....; static int s; .....};
class child: public parent{};
Есть одна проблема:
parent A; child B,C;
A::s = 1;
B::s = 2;
C::s = 3;

cout << A::s << B::s << C::s;

выведет, очевидно, 111. А хотелось бы 123.
Вот в этом и вопрос: как сделать так (и вообще возможно ли это), чтобы некоторое статическое свойство базового класса было бы действительным только в пределах экземпляров этого самого класса, а в пределах экземпляров классов наследников это свойство имело бы другое значение - общее для наследника.
Статическое свойство s класса parent призвано описывать некоторую общую характеристику экземпляров класса наследника. Делать ее не статической нельзя - характеристика может динамически меняться, к тому же таскать в каждом экземпляре наследника еще и ее характеристики всего класса, надо полагать, не разумно.
В общем, если "в лоб" это не разрешимо, то может кто-нибудь уже сталкивался с подобной проблемой и может подсказать вариант решения.
PM MAIL   Вверх
bel_nikita
Дата 8.6.2004, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
тому же таскать в каждом экземпляре наследника еще и ее характеристики всего класса, надо полагать, не разумно.
А где их таскать?
Цитата
чтобы некоторое статическое свойство базового класса было бы действительным только в пределах экземпляров этого самого класса, а в пределах экземпляров классов наследников это свойство имело бы другое значение - общее для наследника.

А так не катит?:
Цитата
class parent {....; int s; .....};
class child: public parent{....; int s; .....};



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
46&two
Дата 8.6.2004, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



То bel_nikita:
увы, не катит: проблема в том, что свойство s используется в некоторой функции базового класса. функция задумана так, чтобы использовать именно значения child::s, если она вызвана из экземпляра класса child а в предложенном варианте, откуда не вызывай, все равно будет использоваться parent::s;
PM MAIL   Вверх
bel_nikita
Дата 8.6.2004, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Ага, я так понимаю, надо из базового класса вытащить коечто из производного? Я правильно понял? Тогда можно попытатся поинтер базового класса привезти к производному.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
46&two
Дата 8.6.2004, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) 46&two - 8.6.2004, 08:53
PM MAIL   Вверх
bel_nikita
Дата 8.6.2004, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
у меня вообще базовый класс про своих наследников ну ничего не знает

так нафиг тогда доступ к производному классу? может тогда стоит обойтись без полиморфа


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 8.6.2004, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



А так?:
Код
class A{
public:
 virtual int GetS()=0; // виртуалим функцию
 int s;  // base class
 void SomeFunc(){ int Temp=GetS(); } // вызов GetS() определенной в производном классе
};

class B: public A{
public:
 int GetS(){ return s; };
 int s;  // derived class
};

Вроде выход из твоей ситуации rolleyes.gif


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
achmed
Дата 8.6.2004, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(46 @ 8.6.2004, 08:14)
Код
class parent {....; static int s; .....};
class child: public parent{};
Есть одна проблема:
parent A; child B,C;
A::s = 1;
B::s = 2;
C::s = 3;

cout << A::s << B::s << C::s;

выведет, очевидно, 111. А хотелось бы 123.
Вот в этом и вопрос: как сделать так (и вообще возможно ли это), чтобы некоторое статическое свойство базового класса было бы действительным только в пределах экземпляров этого самого класса, а в пределах экземпляров классов наследников это свойство имело бы другое значение - общее для наследника.
Статическое свойство s класса parent призвано описывать некоторую общую характеристику экземпляров класса наследника. Делать ее не статической нельзя - характеристика может динамически меняться, к тому же таскать в каждом экземпляре наследника еще и ее характеристики всего класса, надо полагать, не разумно.
В общем, если "в лоб" это не разрешимо, то может кто-нибудь уже сталкивался с подобной проблемой и может подсказать вариант решения.

пусть за статическое всойство класса отвечает виртуальная фуикция.
class parent
{
virtual int GetStaticProp(){ return parent::s};
virtual Do()
{
int a = GetStaticProp();
.....
}
static int s;
}

class child
{
virtual int GetStaticProp(){ return child::cs}


static int cs;
}

PM MAIL   Вверх
46&two
Дата 8.6.2004, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



To bel_nikita:
Этот вариант мне тоже в голову пришел, но у него тоже минус: GetS - не статическая функция, а значит ее код, грубо говоря, будет тиражироваться для каждого экземпляра этого объекта. а статиком ее сделать нельзя, потому что в родительском классе она виртуальна.
To achmed:
кстати да. не сильно красиво, конечно - придется один и тот же код описывать во всех классах наследниках - но зато это должно работать.
PM MAIL   Вверх
bel_nikita
Дата 8.6.2004, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Можно подправить hehe.gif
Код
class A{
public:
virtual int GetS(){return s;};
int s;  // base class
void SomeFunc(){ int Temp=GetS(); } // вызов GetS() определенной в производном классе
};

class B: public A{
public:
int GetS(){ return s; };
int s;  // derived class
};

что-то я я не понимаю. то говоришь, что статик не надо, то статик надо.
опиши суть


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 8.6.2004, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



class Parent
{
private:
static int ps;
public:
virtual int GetS() { return ps;}
static void SetS(int v) { ps = v;}

};

class Child1: public Parent
{
private:
static int ch1s;
public:
int GetS() { return ch1s;}
static SetS(int v) {ch1s = v;}
};

class Child2: public Parent
{
private:
static int ch2s;
public:
int GetS() { return ch2s;}
static SetS(int v) {ch2s = v;}
};

int Parent:tounge.gifs = 0;
int Child::ch1s = 0;
int Child::ch2s = 0;

Parent::SetS(1);
Child1::SetS(2);
Child2::SetS(3);

Parent* p = new Parent();
Parent* p1 = new Child1();
Parent* p2 = new Child2();

cout <<p->GetS() << p1->GetS() << p2->GetS();





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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