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

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

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

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

17.02.2012, 13:47. Просмотров 1561. Ответов 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)?
 ...
};
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2012, 13:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Член класса, создаваемый конструктором с параметром (C++):

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами - C++
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

Член-ссылка на другой член класса - C++
Есть класс Dot с двумя членами - x и y. Требуется еще один класс, который хранит width i height, но реализация этого класса ничем не...

Создание класса с определенным конструктором - C++
Добрый день! Буду благодарен если поможете создать класс VectorEntry который будет соответствовать данному коду: VectorEntry...

Член класса управляемый не может относиться к типу класса неуправляемый - C++
Подскажите пожалуйста, что за ошибка "Член класса управляемый не может относиться к типу класса неуправляемый"? #include <vector> ...

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса - C++
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса), а также статическую функцию, которая...

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

23
Bers
Заблокирован
17.02.2012, 19:08 #16
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от AzaKendler Посмотреть сообщение
Bers, ты же сам отписывал в смежной теме, что указатель на адрес класса показывает на его нулевой байт. т.е. this - это просто адрес "начала" А. если А не будет создан то А нельзя будет использовать. Поскольку B находится внутри A, если A не создался доступ к B мы не получим на уровне языка.
приведи пример опасности плиз
Пока конструктор класса не отработал, нельзя полагаться на валидность значений данных-членов экземпляра этого класса.

И в этом аспекте, тема исключений брошенных в конструкторах участников инициализации заслуживает отдельного рассмотрения.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.02.2012, 19:10  [ТС] #17
Цитата Сообщение от retmas Посмотреть сообщение
сделайте дружественным только конструктор.
То есть?
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.02.2012, 19:16 #18
Цитата Сообщение от Bers Посмотреть сообщение
нельзя полагаться на валидность значений данных-членов экземпляра этого класса
для установления таких связей нам и не нужно на это полагаться. мы вообще эти значения не используем. а то, что не следует использовать эти значения каким-либо образом я уже ранее писал
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть?
написал же (код выше)
Цитата Сообщение от retmas Посмотреть сообщение
friend A::A(); // теперь только A::A() имеет доступ к приватным данным
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
17.02.2012, 19:35 #19
Цитата Сообщение от Bers Посмотреть сообщение
Пока конструктор класса не отработал, нельзя полагаться на валидность значений данных-членов экземпляра этого класса.
ну а как ты положишься на них в этом конкретном случае. B закрыт. вызван может быть только изнутри А. пока А не создан до конца изнутри А ничего вызвано не будет,в этом конкретном примере. снаружи вызывать нечего.
Т.е. даже если в этом случае мы передали B указатель на начало А а потом все обвалилось и А не создался - то и обратится к "несозданным" членам просто некому.
мне кажется что в этом конкретном случае когда B закрыт. опасности нет.

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
{
 public:
     int val;
  class B
  {
  public:
      int z;
      int* p;
      B(A *param):z(param->val),p(param->pz){} //вот опасно pz == 0xcccccccc
  
  };
  A ():val(555),b(this),pz(new int [100]){}
  B b;
  int* pz;
~A(){delete []pz;}
};
память в куче еще не выделилась, т.е. pz еще не инициализирован, но он уже ушел в B.

Но мы разбирали совсем другой пример
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.02.2012, 19:52 #20
думаю, если бы ТС обозначил, чего он хочет добиться, какого поведения/логики, дискуссия была бы короче, а может и не имела бы места быть. а так каждый додумывает свое и тащит одеяло на себя
0
Bers
Заблокирован
17.02.2012, 20:01 #21
Цитата Сообщение от retmas Посмотреть сообщение
для установления таких связей нам и не нужно на это полагаться. мы вообще эти значения не используем. а то, что не следует использовать эти значения каким-либо образом я уже ранее писал
Только гарантий таких не существует. Получатели this объекта не делают предположений, можно ли его дергать, или ещё нельзя. Иначе - нарушение инкапсуляции и инварианта класса.

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

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

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

В общем, сама по себе необходимость передавать this в списке инициализации - признак ущербной архитектуры. Всегда можно сделать все тоже самое, только проще и безопаснее.
0
easybudda
Модератор
Эксперт CЭксперт С++
9662 / 5611 / 952
Регистрация: 25.07.2009
Сообщений: 10,774
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 Посмотреть сообщение
будит не просто
Горбатого могила правит.

0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.02.2012, 20:30 #23
Цитата Сообщение от Bers Посмотреть сообщение
Только гарантий таких не существует. Получатели this объекта не делают предположений, можно ли его дергать, или ещё нельзя.
вопрос таких гарантий - это уже вопрос проектирования класса: установление связи и инициализация данных - суть разные вещи.
Цитата Сообщение от Bers Посмотреть сообщение
если значение аргумента не используется, зачем вообще нужен такой аргумент?
для установления связи с агрегирующим(производным в случае наследования) объектом. использование его может потребоваться позже.
Цитата Сообщение от Bers Посмотреть сообщение
инициализации - признак ущербной архитектуры
ничем не подкрепленное утверждение.
Qt ущербен... слышал много мнений о Qt, но такого мягко говоря не часто.
0
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. Может вообще тогда выбросить все классы нафиг и вернуться к процедурному программированию? Нужен именно объект-часть, предоставляющий наружу часть интерфейса объекта-агрегата.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2012, 10:52
Привет! Вот еще темы с ответами:

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

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

Массив объектов класса как член другого класса - C++
Здравствуйте. У меня тут возникла проблемка #include "main.h" class player { public: player(); player(char*); ...

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса? - C++
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...


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

Или воспользуйтесь поиском по форуму:
24
Yandex
Объявления
18.02.2012, 10:52
Ответ Создать тему
Опции темы

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