Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2009, 14:37   #1
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию Сквозные поля?

А вот если стоит задача сделать общее поле для объектов разных классов? Нашёл только возможность сделать поле сквозным для объектов одного класса.

Можно конечно заюзать глобальную переменную, или запихивать поле в другой объект в качестве аргумента, но неохота какую-то корявость городить.

Вообщем как бы красиво поступить в этом случае?
jojahti вне форума Ответить с цитированием
Старый 10.08.2009, 15:48   #2
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Объявите один класс дружественный другому классу, что бы иметь возможность работать с определенными полями одного класса из другого класса. Либо. как вы уже сказали - глобальные переменные.
oleg kutkov вне форума Ответить с цитированием
Старый 10.08.2009, 15:59   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

создай класс с общими полями и используй множественное наследование, если я правильно понял твою проблему
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 10.08.2009, 16:09   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от jojahti Посмотреть сообщение
А вот если стоит задача сделать общее поле для объектов разных классов?
Можно пример? А то не совсем понятно что за задача. Если я правильно понял, то смотрите паттерн Singleton (Одиночка). т.е. создайте третий класс-одиночку, который будет содержать это общее поле. Если можете выделить из тех двух классов класс-владелец этого поля, то засуньте поле static'ом в этот класс и public-доступ к нему обеспечьте.
Цитата:
Сообщение от jojahti Посмотреть сообщение
Нашёл только возможность сделать поле сквозным для объектов одного класса.
Это как? Поле с модификатором static?
pu4koff вне форума Ответить с цитированием
Старый 10.08.2009, 16:12   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
неохота какую-то корявость городить.
Я бы не сказал что глобальные переменные "корявость".
Используй их и не парься особо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2009, 20:07   #6
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

pu4koff
Цитата:
Это как? Поле с модификатором static?
Угу, оно самое.

Помоему проще всё же так реализовать:
Вопрос такой, может ли впринципе адрес структуры bul измениться между инициализациями им объектов?

Код:
#include <iostream>
using namespace std;

struct bulion
{ int x;
  int y;
  bulion() : x(0), y(0)
                {      }        };
//================================//
class AAA
{ private:
   bulion *ptr;
  public:
   AAA(bulion &bul) : ptr(&bul)
                           {  } };
//================================//
class BBB
{ private:
   bulion *ptr;          
  public:
   BBB(bulion &bul) : ptr(&bul)
                          {  }  };
//================================//
int main() {
  bulion bul;
  AAA a(bul);
  BBB b(bul);
return 0;
}
jojahti вне форума Ответить с цитированием
Старый 10.08.2009, 20:49   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Адрес не изменится. Но я бы использовал паттерн Singleton. Ну или что-то вроде shared_ptr, который вроде должны в новенький стандарт официально записать
А вообще зависит от задачи. Может лучше и параметром передавать, а то тут разделяемый ресурс получается, что не есть безопасно при многопоточности.
В общем, в реальном приложении я бы именно так писать не стал, а для обучения сойдет
pu4koff вне форума Ответить с цитированием
Старый 10.08.2009, 22:12   #8
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Цитата:
Но я бы использовал паттерн Singleton. Ну или что-то вроде shared_ptr, который вроде должны в новенький стандарт официально записать
Мдя, я таких слов даже не слышал. (((

В книжке написано, насчёт конструкторов, что желательно оставлять тело пустым, а инициализацию проводить в скобочках. Вопрос - почему? Ну хотя-бы в общих чертах?
jojahti вне форума Ответить с цитированием
Старый 10.08.2009, 22:46   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от jojahti Посмотреть сообщение
Мдя, я таких слов даже не слышал. (((
Да там ничего сложного. Вот статейку почитай. В принципе что-то вроде варианта с bul, но не надо следить за временем жизни объекта, засорять классы A и B, да и в целом цивильнее выглядит. Свои минусы и свои плюсы конечно у обоих вариантов есть.
Цитата:
Сообщение от jojahti Посмотреть сообщение
В книжке написано, насчёт конструкторов, что желательно оставлять тело пустым, а инициализацию проводить в скобочках. Вопрос - почему? Ну хотя-бы в общих чертах?
Ну если написать так:
Код:
A::A(): x(10)
{
  y.setValue(10);
}
для x при создании вызывает соответствующий конструктор, а для y сначала вызывается конструктор по умолчанию, а потом уже устанавливаем требуемое значение посредством вызова метода, т.е. делаем лишнюю работу.
Если брать простые типы (int, char), то там, возможно, никакой разницы и не будет, но это легко проверить опытным путём.
В общем, основное отличие - при инициализации в теле конструктора, возможны лишние "телодвижения" (выделили память, записали нолик, а потом уже записываем нужное значение, а зачем нолик писать, если можно сразу нужное подставить). Ну опять же не у всех объектов есть публичные конструкторы по умолчанию и по-другому просто не получится их создать. Так что желательно != обязательно и пишите как нравится. Некоторые авторы книжек вообще советуют выносить инициализацию в отдельную функцию (чтобы не дублировать код в конструкторе по умолчанию, конструкторе копии и операторе присваивания).
Только не пишите вот такого в конструкторах:
Код:
A::A(): x(10), y(x)
{
...
}
если в классе они описаны в другом порядке (int y,x), то в y будет "мусор", т.к. x проинициализируется десяткой позже.
Поэтому в конструкторах лучше придерживаться правила: использовать члены класса только на запись, а уж в теле инициализировать или еще где - вопрос личных престрастий.
pu4koff вне форума Ответить с цитированием
Старый 11.08.2009, 19:13   #10
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

pu4koff
Жжёшь!!
jojahti вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поля класса xell29 Общие вопросы Delphi 8 18.06.2009 17:10
поля в DBgrid Mihailhome БД в Delphi 4 19.05.2009 11:24
Слияние и поля!!!! Окоча Юра Microsoft Office Word 2 01.03.2009 22:05
вычисляемые поля Nikola БД в Delphi 4 19.11.2008 13:26
Вычесляемые поля puma Помощь студентам 6 12.05.2008 20:26