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

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

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

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

17.02.2012, 13:47. Просмотров 1524. Ответов 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++
Добрый день! Буду благодарен если поможете создать класс VectorEntry который будет соответствовать данному коду: VectorEntry...

Создание массива класса, с установленным конструктором - C++
Не могу разобраться, создаю ссылку на класс в h файле, далее в cpp инициализирую, *.h FILE* file. *.cpp, вот тут мне нужен...

Ошибка инициализации объекта, конструктором класса - C++
Добрый день. Написал программу. Создание класса (упражнение из книги Дейтеля) "Создайте класс с именем Account, которым мог бы...

Не создается указатель из-за базового класса с конструктором - C++
class Cbase { public: virtual void Start( ); int iGlobal; Cbase( int num ) { iGlobal = num ;

Задание начальных значений объекта класса конструктором - C++
здравствуйте, форумчане. подскажите, пожалуйта, можно ли реализовать следующее: нужно создать конструктор, способный использовать...

Создание массива экземпляров класса с не стандарным конструктором - C++
Здравствуйте. Подскажите пожалуйста. Есть у меня некий класс Аaa. У него два конструктора - простой и с передаваемым параметром. class...

Как создать объект с конструктором в интерфейсе другого класса? - C++
struct WorkerInfo { WorkerInfo(int iPay, int iDebt) : pay (iPay), iDebt(debt) {} ~WorkerInfo() {} int pay; // зарплата ...

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

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

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

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

В общем, сама по себе необходимость передавать this в списке инициализации - признак ущербной архитектуры. Всегда можно сделать все тоже самое, только проще и безопаснее.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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++
"член класса управляемый не может относиться к типу класса не управляемый" Не могу понять что делать с этой ошибкой и как...

Static член класса - C++
Всем привет! Подскажите, пожалуйста, почему так писать нельзя: В хедере объявляю статический метод: public: explicit...

Глобальный член класса - C++
Пишу программу, в которой много классов, и каждый лежит в своем файле. Все работает. Но как только после определения класса я объявляю член...

Не функция-член класса - C++
Фрагмент из книги, об дружественной функции operator<<: "Обратите внимание, что она не является функцией-членом класса String". Из чего...

Static-член класса - C++
Подскажите пожалуйста в чем проблема, не получается инициализировать static-член указатель на объекты класса. counter инициализируется...


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

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

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