Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

просто есть статический член у базового, и хотелось бы, что каждый наследник переопределял этот член своим уникальным значением. Теоретически нельзя - не подскажите что думаете по этому поводу? какие-нить костыли тож пригодятся))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 10:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Своеборазное переопределение статических членов в потомках (C++):

Инициализация статических членов класса - C++
Непонятно, почему статические члены класса нельзя инициализировать при помощи вот такого синтаксиса: static int const...

Определение статических переменных - членов класса - C++
Доброе утро! Не могу понять, почему возникает ошибка. Есть класс в Manager.h: class Manager { public: static Manager*...

Принцип инициализации статических членов шаблона класса - C++
Доброго времени суток. Рассмотрим пример: #include <iostream> int foo(){ return 0; } template<class T> struct...

Инициализация в объявлении константных статических (const static) членов-данных класса. - C++
Привет. Подскажите пожалуйста почему нельзя создавать в классе const static float, а const static int можно? class A{ const...

Определение чисто виртуальных функций в потомках - C++
Можно ли вместо определения чисто виртуальной функции в классе-потомке написать эту самую функцию без тела? Т.е. она как бы есть, но ее как...

Копирование памяти по базовым классам без потери инфы о потомках - C++
Hola forum! :senor: И так. Есть базовый класс A и его дочерний класс B. Предположим есть какой - то вектор с указателями на дочерний...

15
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
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;
}
0
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 11:00  [ТС] #3
это создается отдельная копия? в наследнике?
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
17.06.2014, 11:02 #4
Я пирвел компилируемый пример, можете проверить и сами.
0
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 11:03  [ТС] #5
цель проста - хотелось бы, чтобы базовый класс задавал свои свойства - статические, но так, чтобы эти свойства сохранялись бы и у наследников, но только значения этих свойств у каждого класса были бы свои, - хотел найти легкий путь решения проблемы - мол объявлять каждый раз эти свойства у наследников как-то лень)
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
17.06.2014, 11:04 #6
А зачём вам копия в наследнике? Объясните суть задачи. Ок...

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

Добавлено через 2 минуты
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями) при визуализации было бы удобно хранить информацию только у класса, а не в каждом экземпляре
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
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 минуту
Примет от фонаря.
0
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
17.06.2014, 12:55  [ТС] #9
вы храните свойства в объекте - а зачем? представьте что у вас миллион акул - экземляров класса - акула - наследник от рыбы - зачем хранить такие свойства в объекте - если можно поместить данные в сам класс - поняли мысль? большой расход памяти
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
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;
}
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.06.2014, 14:18 #11
Цитата Сообщение от PmAlex Посмотреть сообщение
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями)
Вы пока не поняли что такое наследование. При наследовании свойства базового класса не затираются, а наследуются, и дополняются еще чем-то.
Цитата Сообщение от PmAlex Посмотреть сообщение
представьте что у вас миллион акул - экземляров класса - акула - наследник от рыбы
Каждый объект акулы содержит внутри объект рыбы с его свойствами.
0
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
19.06.2014, 10:09  [ТС] #12
Я прекрасно понимаю наследование) просто я не вижу смысла хранить свойства класса в его экземпляре, если предполагается по условию задачи, что экземпляр не будет переопределять свое поведение (в том числе свои визуальные свойства) - поэтому и решил что не стоит хранить свойства в экземпляре - представьте, что у меня в распоряжении 1000000 однотипных рыб - но разных классов - они не изменяют свои свойства и тд. зачем мне хранить одну и ту же информацию в каждом объекте?
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
19.06.2014, 11:24 #13
Цитата Сообщение от PmAlex Посмотреть сообщение
Я прекрасно понимаю наследование)
Ну, если бы понимали, то не писали бы таких вещей:
Цитата Сообщение от PmAlex Посмотреть сообщение
допустим есть базовый класс рыба у него есть свойства (визуальные), а у наследников (конкретных реализаций рыб) эти свойства тоже есть, но они уже отличаются значениями
Наследник класса рыба является полноценной рыбой, т.е. обладает всеми свойствами рыбы, поэтому они не могут «отличаться значениями».
Если же в базовом классе эти свойства не используются, то не следует туда их и помещать, а сделать этот класс абстрактным и объявить в нем чисто виртуальную функцию get_visual_traits(), которую и замещать в наследниках.
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
19.06.2014, 11:28 #14
Да понятно, что тут речь не о наследовании. Нужно параметризовать множество классов общими свойствами с минимумом накладных расходов. Как сделать - я покзал на предыдущей странице. Наследование тут - просто чстный пример, по факту его может и не быть.
1
PmAlex
5 / 5 / 1
Регистрация: 09.11.2013
Сообщений: 58
19.06.2014, 11:37  [ТС] #15
согласен - с шаблонами можно попробовать
0
19.06.2014, 11:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2014, 11:37
Привет! Вот еще темы с ответами:

Как через базовый класс вызывать виртуальную функцию во всех потомках? - C++
Ну например, есть класс: class BATYANA { BATYANA(); virtual ~BATYANA(); virtual int Test(); }

найти сумму 10-ти членов следующих общих членов,которые даны снизу - C++
найти сумму 10-ти членов следующих общих членов,которые даны снизу {a}_{n}={n}^{3}{e}^{n}

найти сумму 10-ти членов следующих общих членов,которые даны снизу - C++
Найти сумму 10-ти членов следующих общих членов,которые даны снизу. {a}_{n} = {n}^{3}{e}^{-n}

Для заданной матрицы найти такие k и n, что сумма членов k-го столбца совпадает с суммой членов n-й строки - C++
Нужно написать фрагмент кода: Для заданной матрицы размера NхN найти такие k и n, что сумма элементов k-столбца матрицы совпадает с...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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