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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Член класса, создаваемый конструктором с параметром - C++

17.02.2012, 13:47. Просмотров 1495. Ответов 23
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
 public:
  class B
  {
   ...
   B(A *param); // Как открыть этот конструктор классу A, но закрыть его ото всех остальных частей программы?
   ...
  };
 B b; // Как создать этот член с помощью конструктора B::B(A *param)?
 ...
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2012, 13:47     Член класса, создаваемый конструктором с параметром
Посмотрите здесь:

C++ Член-ссылка на другой член класса
Задание начальных значений объекта класса конструктором C++
C++ Как создать объект с конструктором в интерфейсе другого класса?
C++ Ошибка инициализации объекта, конструктором класса
Глобальный член класса C++
C++ Не функция-член класса
Не создается указатель из-за базового класса с конструктором C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
17.02.2012, 20:01     Член класса, создаваемый конструктором с параметром #21
Цитата Сообщение от retmas Посмотреть сообщение
для установления таких связей нам и не нужно на это полагаться. мы вообще эти значения не используем. а то, что не следует использовать эти значения каким-либо образом я уже ранее писал
Только гарантий таких не существует. Получатели this объекта не делают предположений, можно ли его дергать, или ещё нельзя. Иначе - нарушение инкапсуляции и инварианта класса.

В многоэтажной архитектуре проконтролировать "что где можно, а что где нельзя" будит не просто.
Если кто нибудь в такой архитектуре дернет то, что дергать не положено - будет очень мерзкая ошибка, а отладчик - ваш лучший друг на многие часы.

Есть более красивое и простое решение: "того, чего дергать нельзя - не должно быть".
Бритва Оккама: "если возможность не должна быть использована, то самой такой возможности не должно быть".

/ps если значение аргумента не используется, зачем вообще нужен такой аргумент?

В общем, сама по себе необходимость передавать this в списке инициализации - признак ущербной архитектуры. Всегда можно сделать все тоже самое, только проще и безопаснее.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
17.02.2012, 20:27     Член класса, создаваемый конструктором с параметром #22
Цитата Сообщение от retmas Посмотреть сообщение
думаю, если бы ТС обозначил, чего он хочет добиться, какого поведения/логики, дискуссия была бы короче, а может и не имела бы места быть. а так каждый додумывает свое...
Самая разумная мысль во всей теме.

Цитата Сообщение от taras atavin Посмотреть сообщение
Закрыть надо только конструктор и деструктор: задача просто блокировать возможность существования экземпляров класса A::B вне экземпляров класса A, то есть гарантировать, что любой экземпляр класса A::B будет членом класса A, но при этом сами экземпляры класса A::B и все public члены класса A::B должны быть доступны извне, а private-члены класса A::B должны быль доступны только из самого класса A::B и недоступны из класса A.
Ну так сделайте в классе А функции-обёртки к открытым функциям класса В. Вообще действительно не понятно, за чем нужно в конструктор объекта В передавать указатель на объект А, внутри которого (и только там) этот самый объект класса В и существует.

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
будит не просто
Горбатого могила правит.

retmas
Жарю без масла
842 / 724 / 158
Регистрация: 13.01.2012
Сообщений: 1,671
17.02.2012, 20:30     Член класса, создаваемый конструктором с параметром #23
Цитата Сообщение от Bers Посмотреть сообщение
Только гарантий таких не существует. Получатели this объекта не делают предположений, можно ли его дергать, или ещё нельзя.
вопрос таких гарантий - это уже вопрос проектирования класса: установление связи и инициализация данных - суть разные вещи.
Цитата Сообщение от Bers Посмотреть сообщение
если значение аргумента не используется, зачем вообще нужен такой аргумент?
для установления связи с агрегирующим(производным в случае наследования) объектом. использование его может потребоваться позже.
Цитата Сообщение от Bers Посмотреть сообщение
инициализации - признак ущербной архитектуры
ничем не подкрепленное утверждение.
Qt ущербен... слышал много мнений о Qt, но такого мягко говоря не часто.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2012, 10:52     Член класса, создаваемый конструктором с параметром
Еще ссылки по теме:

C++ Член класса управляемый не может относиться к типу класса не управляемый
Создание массива класса, с установленным конструктором C++
C++ Создание класса с определенным конструктором
C++ Создание массива экземпляров класса с не стандарным конструктором
Static-член класса C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.02.2012, 10:52  [ТС]     Член класса, создаваемый конструктором с параметром #24
Цитата Сообщение от Bers Посмотреть сообщение
В общем, сама по себе необходимость передавать this в списке инициализации - признак ущербной архитектуры.
A - агрегат, B - часть. Так как это агрегация, то экземпляры B не могут существовать вне экземпляров A, а время существования A и B совпадает. Но при этом интерфейс B является частью интерфейса A. Кроме того, B должен иметь доступ ко всем public-членам A, в том числе, несколько экземпляров B внутри одного экземпляра A должны иметь перекрёстный доступ друг к другу. Как это ещё может быть реализовано, кроме ссылки owner, реализованной через указатель? И откуда взять адрес для значения этого указателя?
Цитата Сообщение от easybudda Посмотреть сообщение
Ну так сделайте в классе А функции-обёртки к открытым функциям класса В
Ну так они и будут непосредственно в A. Может вообще тогда выбросить все классы нафиг и вернуться к процедурному программированию? Нужен именно объект-часть, предоставляющий наружу часть интерфейса объекта-агрегата.
Yandex
Объявления
18.02.2012, 10:52     Член класса, создаваемый конструктором с параметром
Ответ Создать тему
Опции темы

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