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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.02.2012, 13:47     Член класса, создаваемый конструктором с параметром #1
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
17.02.2012, 20:01     Член класса, создаваемый конструктором с параметром #21
Цитата Сообщение от retmas Посмотреть сообщение
для установления таких связей нам и не нужно на это полагаться. мы вообще эти значения не используем. а то, что не следует использовать эти значения каким-либо образом я уже ранее писал
Только гарантий таких не существует. Получатели this объекта не делают предположений, можно ли его дергать, или ещё нельзя. Иначе - нарушение инкапсуляции и инварианта класса.

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

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

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

В общем, сама по себе необходимость передавать this в списке инициализации - признак ущербной архитектуры. Всегда можно сделать все тоже самое, только проще и безопаснее.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
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++

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

Или воспользуйтесь поиском по форуму:
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     Член класса, создаваемый конструктором с параметром
Ответ Создать тему
Опции темы

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