Форум программистов, компьютерный форум CyberForum.ru

Своеборазное переопределение статических членов в потомках - C++

Восстановить пароль Регистрация
 
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 10:50     Своеборазное переопределение статических членов в потомках #1
Доброго времени суток! Хотел бы обсудить одну тему:
C++
1
2
3
4
5
6
7
8
class A{
     static int mmm;
     //...................
}
class B : public A{
     static int mmm;
     //...................
}
Возможно ли каким нибудь способом определить свою копию статического члена в наследнике?

просто есть статический член у базового, и хотелось бы, что каждый наследник переопределял этот член своим уникальным значением. Теоретически нельзя - не подскажите что думаете по этому поводу? какие-нить костыли тож пригодятся))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.06.2014, 10:55     Своеборазное переопределение статических членов в потомках #2
Странного хотите. Ну пусть будет в каждом классе свое статическое поле... Чего добиться-то пытаетесь?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct A {
    static int n;   
};
 
struct B : A {
    static int n;
};
 
int A::n = 42;
int B::n = 101;
 
int main() {
    std::cout << A::n << std::endl;
    std::cout << B::n << std::endl;
    return 0;
}
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 11:00  [ТС]     Своеборазное переопределение статических членов в потомках #3
это создается отдельная копия? в наследнике?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.06.2014, 11:02     Своеборазное переопределение статических членов в потомках #4
Я пирвел компилируемый пример, можете проверить и сами.
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 11:03  [ТС]     Своеборазное переопределение статических членов в потомках #5
цель проста - хотелось бы, чтобы базовый класс задавал свои свойства - статические, но так, чтобы эти свойства сохранялись бы и у наследников, но только значения этих свойств у каждого класса были бы свои, - хотел найти легкий путь решения проблемы - мол объявлять каждый раз эти свойства у наследников как-то лень)
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
17.06.2014, 11:04     Своеборазное переопределение статических членов в потомках #6
А зачём вам копия в наследнике? Объясните суть задачи. Ок...

"Чтобы эти свойства сохранялись бы и у наследников, но только значения этих свойств у каждого класса были бы свои" - не чувствуете взаимоисключающих параграфов?)
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 11:08  [ТС]     Своеборазное переопределение статических членов в потомках #7
я верю, что работает - просто каждый раз объявлять одно и то же поле у наследника - как то не резонно - по-моему мнению - вот я и спросил - можно ли как-нибудь более красивым способом)) а за ответ спасибо) в принципе, он решает проблему

Добавлено через 2 минуты
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями) при визуализации было бы удобно хранить информацию только у класса, а не в каждом экземпляре
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.06.2014, 11:19     Своеборазное переопределение статических членов в потомках #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum class Color {
    Red,
    Green,
    Blue
};
 
struct Fish {
    Fish(Color color) : color_{color} {}
 
    Color color_;   
};
 
struct CustomFish : Fish {
    CustomFish() : Fish{Color::Red} {}
};
Добавлено через 1 минуту
Примет от фонаря.
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 12:55  [ТС]     Своеборазное переопределение статических членов в потомках #9
вы храните свойства в объекте - а зачем? представьте что у вас миллион акул - экземляров класса - акула - наследник от рыбы - зачем хранить такие свойства в объекте - если можно поместить данные в сам класс - поняли мысль? большой расход памяти
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.06.2014, 13:18     Своеборазное переопределение статических членов в потомках #10
Тогда добро пожаловать в волшебный мир шаблонов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
template <typename FishTraits>
struct Fish
{
    void PrintInfo()
    {
        std::cout << "Rows: " << FishTraits::teeth_rows << std::endl;
    }
};
 
 
struct SharkTraits
{
    static const int teeth_rows = 2;    
};
 
struct GoldenFishTraits
{
    static const int teeth_rows = 1;
};
 
struct Shark : Fish<SharkTraits>
{
};
 
struct GoldenFish : Fish<GoldenFishTraits>
{
};
 
 
int main()
{
    Shark s;
    GoldenFish g;
    s.PrintInfo();
    g.PrintInfo();
    
    return 0;
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
17.06.2014, 14:18     Своеборазное переопределение статических членов в потомках #11
Цитата Сообщение от PmAlex Посмотреть сообщение
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями)
Вы пока не поняли что такое наследование. При наследовании свойства базового класса не затираются, а наследуются, и дополняются еще чем-то.
Цитата Сообщение от PmAlex Посмотреть сообщение
представьте что у вас миллион акул - экземляров класса - акула - наследник от рыбы
Каждый объект акулы содержит внутри объект рыбы с его свойствами.
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
19.06.2014, 10:09  [ТС]     Своеборазное переопределение статических членов в потомках #12
Я прекрасно понимаю наследование) просто я не вижу смысла хранить свойства класса в его экземпляре, если предполагается по условию задачи, что экземпляр не будет переопределять свое поведение (в том числе свои визуальные свойства) - поэтому и решил что не стоит хранить свойства в экземпляре - представьте, что у меня в распоряжении 1000000 однотипных рыб - но разных классов - они не изменяют свои свойства и тд. зачем мне хранить одну и ту же информацию в каждом объекте?
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
19.06.2014, 11:24     Своеборазное переопределение статических членов в потомках #13
Цитата Сообщение от PmAlex Посмотреть сообщение
Я прекрасно понимаю наследование)
Ну, если бы понимали, то не писали бы таких вещей:
Цитата Сообщение от PmAlex Посмотреть сообщение
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями
Наследник класса рыба является полноценной рыбой, т.е. обладает всеми свойствами рыбы, поэтому они не могут «отличаться значениями».
Если же в базовом классе эти свойства не используются, то не следует туда их и помещать, а сделать этот класс абстрактным и объявить в нем чисто виртуальную функцию get_visual_traits(), которую и замещать в наследниках.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.06.2014, 11:28     Своеборазное переопределение статических членов в потомках #14
Да понятно, что тут речь не о наследовании. Нужно параметризовать множество классов общими свойствами с минимумом накладных расходов. Как сделать - я покзал на предыдущей странице. Наследование тут - просто чстный пример, по факту его может и не быть.
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
19.06.2014, 11:37  [ТС]     Своеборазное переопределение статических членов в потомках #15
согласен - с шаблонами можно попробовать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2014, 12:08     Своеборазное переопределение статических членов в потомках
Еще ссылки по теме:

C++ Обработка статических масссивов
Принцип инициализации статических членов шаблона класса C++
C++ Копирование памяти по базовым классам без потери инфы о потомках

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
19.06.2014, 12:08     Своеборазное переопределение статических членов в потомках #16
Цитата Сообщение от 0x10 Посмотреть сообщение
Да понятно, что тут речь не о наследовании.
Ну, для решения проблемы автора наследование как раз необходимо, только не от зверушек всяких, а от класса визуального объекта.
Вот так, например, можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/////////////////////////////////////////////////////////////////////////////////////////
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
class  T_visual_obj
{
public:
    virtual     T_str   get_visual_traits()     =   0;
    //-----------------------------------------------------------------------------------
    virtual     ~T_visual_obj() {}
};
/////////////////////////////////////////////////////////////////////////////////////////
class  T_fish   :   public  T_visual_obj
{
public:
    virtual     T_str   get_visual_traits()
    {
        return  "рыба";
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
class  T_horse  :   public  T_visual_obj
{
public:
    virtual     T_str   get_visual_traits()
    {
        return  "лошадь";
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
int  main()
{
    std::locale::global(std::locale(""));
    srand( unsigned( time(0) ) );
 
    T_visual_obj*   visual_obj_p    =   0;
 
    for(;;)
    {
        if( rand() % 2 )
        {
            visual_obj_p    =   new     T_fish;
        }
        else
        {
            visual_obj_p    =   new     T_horse;
        }
 
        std::cout   <<  "\n\n\n\n\n\nОтображается "
                    <<  visual_obj_p->get_visual_traits()
                    <<  "."
                    <<  std::endl;
 
        delete  visual_obj_p;
        system( "pause" );
    }//for
}
Yandex
Объявления
19.06.2014, 12:08     Своеборазное переопределение статических членов в потомках
Ответ Создать тему
Опции темы

Текущее время: 03:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru