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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
#1

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

17.06.2014, 10:50. Просмотров 765. Ответов 15
Метки нет (Все метки)

Доброго времени суток! Хотел бы обсудить одну тему:
C++
1
2
3
4
5
6
7
8
class A{
     static int mmm;
     //...................
}
class B : public A{
     static int mmm;
     //...................
}
Возможно ли каким нибудь способом определить свою копию статического члена в наследнике?

просто есть статический член у базового, и хотелось бы, что каждый наследник переопределял этот член своим уникальным значением. Теоретически нельзя - не подскажите что думаете по этому поводу? какие-нить костыли тож пригодятся))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 10:50     Своеборазное переопределение статических членов в потомках
Посмотрите здесь:
Инициализация статических членов класса C++
Определение статических переменных - членов класса C++
Принцип инициализации статических членов шаблона класса C++
Инициализация в объявлении константных статических (const static) членов-данных класса. C++
Определение чисто виртуальных функций в потомках C++
C++ Копирование памяти по базовым классам без потери инфы о потомках
C++ Как через базовый класс вызывать виртуальную функцию во всех потомках?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
17.06.2014, 11:02     Своеборазное переопределение статических членов в потомках #4
Я пирвел компилируемый пример, можете проверить и сами.
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 11:03  [ТС]     Своеборазное переопределение статических членов в потомках #5
цель проста - хотелось бы, чтобы базовый класс задавал свои свойства - статические, но так, чтобы эти свойства сохранялись бы и у наследников, но только значения этих свойств у каждого класса были бы свои, - хотел найти легкий путь решения проблемы - мол объявлять каждый раз эти свойства у наследников как-то лень)
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
17.06.2014, 11:04     Своеборазное переопределение статических членов в потомках #6
А зачём вам копия в наследнике? Объясните суть задачи. Ок...

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

Добавлено через 2 минуты
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями) при визуализации было бы удобно хранить информацию только у класса, а не в каждом экземпляре
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
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
Эксперт С++
3043 / 1688 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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
Эксперт С++
3043 / 1688 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
19.06.2014, 11:24     Своеборазное переопределение статических членов в потомках #13
Цитата Сообщение от PmAlex Посмотреть сообщение
Я прекрасно понимаю наследование)
Ну, если бы понимали, то не писали бы таких вещей:
Цитата Сообщение от PmAlex Посмотреть сообщение
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями
Наследник класса рыба является полноценной рыбой, т.е. обладает всеми свойствами рыбы, поэтому они не могут «отличаться значениями».
Если же в базовом классе эти свойства не используются, то не следует туда их и помещать, а сделать этот класс абстрактным и объявить в нем чисто виртуальную функцию get_visual_traits(), которую и замещать в наследниках.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
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++ найти сумму 10-ти членов следующих общих членов,которые даны снизу
C++ найти сумму 10-ти членов следующих общих членов,которые даны снизу
C++ Для заданной матрицы найти такие k и n, что сумма членов k-го столбца совпадает с суммой членов n-й строки
C++ использование статических массивов
сортировка статических структур C++

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3043 / 1688 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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     Своеборазное переопределение статических членов в потомках
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru