русский
Germany.ruForen → Архив Досок→ Programmierung

overload static data member

187  1 2 3 alle
desyman свой человек24.12.06 19:58
desyman
NEW 24.12.06 19:58 
in Antwort scorpi_ 24.12.06 19:48, Zuletzt geändert 24.12.06 20:00 (desyman)
в последнем примере
игнорируется обявление static double a
почему ??
#21 
  scorpi_ nobody24.12.06 20:04
NEW 24.12.06 20:04 
in Antwort desyman 24.12.06 19:45
Compiling...
main.cpp
i:\projects\source\test\main.cpp(32) : error C2228: left of '.set' must have class/struct/union
type is 'A [10]'
i:\projects\source\test\main.cpp(33) : error C2228: left of '.set' must have class/struct/union
type is 'B [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'A [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'A [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'B [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'B [10]'
6 error(s), 0 warning(s)
#22 
  joldosch посетитель26.12.06 10:11
joldosch
NEW 26.12.06 10:11 
in Antwort scorpi_ 24.12.06 20:04
for(int i=0;i<10;++i)
{
a_arr.set((double) i);
b_arr.set((double) i);
Index упущен...
#23 
  joldosch посетитель26.12.06 10:27
joldosch
NEW 26.12.06 10:27 
in Antwort scorpi_ 24.12.06 20:04
Тебе нужно в дочернем классе переписать метод "set", в котором ты должен указать на переменную "а" из класса "А" как this::a (Я не уверен в правильности синтакса...).
А вообще-то у тебя две разные переменные и почему ты их одним именем обозвал?...
#24 
  joldosch посетитель26.12.06 10:36
joldosch
NEW 26.12.06 10:36 
in Antwort scorpi_ 24.12.06 20:04
Э-э... прошу прощения, последнее адресовано вопрошающему.
#25 
desyman свой человек26.12.06 18:01
desyman
NEW 26.12.06 18:01 
in Antwort joldosch 26.12.06 10:27
обозвал одним именем, чтобы в дочернем классе
пользоватся методами родительского класса
#26 
desyman свой человек26.12.06 18:37
desyman
NEW 26.12.06 18:37 
in Antwort desyman 22.12.06 14:15, Zuletzt geändert 26.12.06 18:48 (desyman)

В ответ на:

#include <iostream>
using namespace std;
class A
{
protected:
// static double a;
double a;
public:
void set(const double i){this->a=i;}
double* get(){return &(this->a);}
};
class B:public A
{
protected:
static double a;
public:
};
class C:public A
{
protected:
static double a;
public:
};
//double A::a= (double) 1;
double B::a= (double) 2;
double C::a= (double) 3;
B b_arr[5];
C c_arr[5];
int main ()
{
for(int k=0;k<5;++k)
{
b_arr[k].set((double) 4);
// c_arr[k].set((double) 5);
printf("%d C::a = %p %2.0f B::a = %p %2.0f \n",
i,
(c_arr[k].get()), *(c_arr[k].get()),
(b_arr[k].get()), *(b_arr[k].get())
);
}
return 1;
}
0 C::a = 0x8049ac0 0 B::a = 0x8049a80 4
1 C::a = 0x8049ac8 0 B::a = 0x8049a88 4
2 C::a = 0x8049ad0 0 B::a = 0x8049a90 4
3 C::a = 0x8049ad8 0 B::a = 0x8049a98 4
4 C::a = 0x8049ae0 0 B::a = 0x8049aa0 4


a nado tak:
0 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
1 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
2 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
3 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
4 C::a = 0x8049ac0 3 B::a = 0x8049a80 4

#27 
  scorpi_ nobody26.12.06 19:21
NEW 26.12.06 19:21 
in Antwort desyman 26.12.06 18:37, Zuletzt geändert 26.12.06 19:22 (scorpi_)
Да Вам батенька учебник курить надо. Вы же совершенно не понимаете, что такое static. Ваши get и set обращаются в любом случае к A::a, статические переменные B::a и C::a здесь просто остаются за кадром. И нафига тут вообще масивы и геты/сеты, когда мы говорим о статических переменных, которые для всех инстанций класса тождественны?
Что Вам здесь непонятно?
В ответ на:
#include <iostream>
using namespace std;
struct A { static double a; };
struct B : public A { static double a; };
struct C : public A { static double a; };
double A::a = 1.;
double B::a = 2.;
double C::a = 3.;
int main ()
{
cout << A::a << "\n" << B::a << "\n" << C::a << endl;
}
Ausgabe:
1
2
3


#28 
Murr коренной житель26.12.06 21:11
Murr
NEW 26.12.06 21:11 
in Antwort desyman 26.12.06 18:01
обозвал одним именем, чтобы в дочернем классе
пользоватся методами родительского класса
------
Ну а если все же использовать то место, которым должно думать?
Например, попытаться ответить на абсолютно идиотский вопрос:
- А как родительский класс узнает каким классом он унаследован?
Ну или на другой:
- А что если наследников - несколько?
А вообще - стоит что-нибудь почитать по ООП...
#29 
Simple Nothing is f*cked27.12.06 10:59
Simple
NEW 27.12.06 10:59 
in Antwort Murr 26.12.06 21:11
> А как родительский класс узнает каким классом он унаследован?
Вопрос действительно идиотский. Читай учебник ;)
#30 
desyman свой человек27.12.06 12:27
desyman
NEW 27.12.06 12:27 
in Antwort Simple 27.12.06 10:59, Zuletzt geändert 27.12.06 12:27 (desyman)

#include <iostream>
using namespace std;
class A
{
protected:
public:
virtual void set(double i) = 0;
virtual double get() const = 0;
};
//float* A::a=(float*) 1;
class B:public A
{
protected:
static double a;
public:
virtual void set(double i) { a =i;}
virtual double get() const { return a;}
};
class C:public A
{
protected:
static double a;
public:
virtual void set(double i) { a =i;}
virtual double get() const { return a;}
};
double B::a= (double) 22;
double C::a= (double) 33;
B b_arr[10];
C c_arr[10];
int main ()
{
for(int j=0;j<10;++j)
{
printf("%d B::a = %2.0f C::a = %2.0f \n",
i,
(b_arr[j].get()),
(c_arr[j].get()));
}
return 1;
}


#31 
desyman свой человек27.12.06 12:39
desyman
NEW 27.12.06 12:39 
in Antwort desyman 27.12.06 12:27, Zuletzt geändert 27.12.06 12:41 (desyman)
ок
переформулирую свой вопрос немножко
возможно ли, не используя статик и глобальные переменные,
разделить члены данные для дочерных классов не определяя по-новому для каждого дочернего класса члены методы, работаюшие с этими членами данными
-
Симпл предложил воспользоватся траитс, но честно говоря и вправду трудновато для понимания с первого раза.
#32 
  Chipolino местный житель27.12.06 14:35
NEW 27.12.06 14:35 
in Antwort desyman 24.12.06 13:32
В ответ на:

значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)

Почему не сделаешь их константами ?
Статик-с другой оперы .
#33 
  Chipolino местный житель27.12.06 14:48
NEW 27.12.06 14:48 
in Antwort desyman 27.12.06 12:27
В ответ на:

int main ()
{
for(int j=0;j<10;++j)
{
printf("%d B::a = %2.0f C::a = %2.0f \n",
i,
(b_arr[j].get()),
(c_arr[j].get()));
}
return 1;
}

у тебя и здесь ошибка
в printf - j,не i
И почему ты вообще используешь сишные функции , вместо плюсовых обьектов ?
#34 
desyman свой человек27.12.06 15:25
desyman
27.12.06 15:25 
in Antwort Chipolino 27.12.06 14:35
В ответ на:

В ответ на:
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
Почему не сделаешь их константами ?
Статик-с другой оперы .

конст = не перезаписываемая
статик = одно и то же значение для всех обектов (инициаций) класса
мне нужно второе
#35 
desyman свой человек27.12.06 15:26
desyman
NEW 27.12.06 15:26 
in Antwort Chipolino 27.12.06 14:48
сорри,
опечатка
#36 
  Chipolino местный житель27.12.06 17:54
NEW 27.12.06 17:54 
in Antwort desyman 27.12.06 15:25, Zuletzt geändert 27.12.06 17:59 (Chipolino)
В ответ на:

но неизменны для обектов одного класса

Дык сам написал неизменяемая
В ответ на:

конст = не перезаписываемая

Ключевое слово mutable ;-)
В ответ на:

одно и то же значение для всех обектов (инициаций) класса

Может инстанций ?
ЗЫ.Постарайся сформулировать свою проблему человеческим,русским языком.
Чего , конкретно , ты хочешь добиться ?
#37 
desyman свой человек27.12.06 17:55
desyman
NEW 27.12.06 17:55 
in Antwort Chipolino 27.12.06 14:48
мм
еше вопрос:
о каких обектах реч?
#38 
desyman свой человек27.12.06 18:14
desyman
NEW 27.12.06 18:14 
in Antwort Chipolino 27.12.06 17:54
с русским языком у меня вот особенно туго
попробую обяснить в н-ый раз (может хоть сам пойму наконец)
имею задачку:
добавить в ГУИ механизм ограничения визуализации списков обэктов
обекты генерятся разными классами.
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
{пересчитал. итого 6 таких классов и соответственно 6 списков).
классы АКласс,БКласс.. наследуют от ПКласс (родительский класс). различия между дочерними классами не велико. 3-4 метода.
списки обектов да и сами обекты хранятся в файле.
результат должен выглядеть вот так:
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
вот такая задачка.
#39 
  scorpi_ nobody27.12.06 19:04
NEW 27.12.06 19:04 
in Antwort desyman 27.12.06 18:14
Ну так пиши на немецком или английском. Можешь даже на французском, я пойму.
В ответ на:
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)

И где здесь параметры одинаковые для всех инстанций класса?
#40 
1 2 3 alle