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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
#1

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++

05.07.2011, 22:45. Просмотров 3263. Ответов 42
Метки нет (Все метки)

На самом деле ничё фантастического я не прошу, ведь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
template <class T>
class matrix {
        
 friend class diagonal;
 
//Вложенный класс
 public:
  class diagonal; 
 
 //Объявляем переменную такого класса 
 diagonal di;
  
 //Вот эту переменную хотелоь бы изменить в конструкторе вложенного класса
 private: 
  int per; 
 
 
};
 
 
 
template <class T>
class matrix<T>::diagonal {
 public:
  diagonal (){
   //Не изменяеится, говорится что неизвестное использование нестатической переменной per
   per= 90;
  }
};
 
 
int main () {
 matrix <int> k;
 k.di; 
}
Вот посмотрите, по-хорошему надо указать какому именно объекту дружественен класс B, чтобы потом использовать per так:
C++
1
ima_obekta_matrix.per= 90;
Но в том-то и дело, что компилятору уже известно, что объект, членом которого является di, не какой-то мифический объект, а он кокретно тот объект- куда вложен объект di. Но как компилятру объяснить, что переменную per надо брать именнно оттуда? Вот в чём вопрос!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2011, 22:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? (C++):

Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? - C++
Ответ как бы знаю(нет , да). но наверное я что-то не так понимаю, т.к. примерчик написать не получается. class BaseClass { ...

Класс: как обратиться к методу производного класса через итератор на базовый класс? - C++
Есть абстрактный и два порожденных. Хочу создать например list&lt;Base*&gt; list1; затем добавляю себе в список: ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка - C++
Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки...

Отдельно класс данных, класс формул и главный класс - C++
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и п - C++
Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и путем копирования другой...

42
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
07.07.2011, 19:03  [ТС] #31
А как надо освобождать память?
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
07.07.2011, 19:09 #32
можно проверять kolvo_strok и kolvo_stolbcov и в зависимости от него вызывать соответсвующий delete, либо в конструкторе по умолчанию выделять наверное так
C++
1
2
 p[0]= new T[1];
 p[1]= new T[1];
второй вариант выглядит предпостительнее, так как не надо никаких ветвлений в деструкторе
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
07.07.2011, 19:30  [ТС] #33
Цитата Сообщение от pito211 Посмотреть сообщение
можно проверять kolvo_strok и kolvo_stolbcov и в зависимости от него вызывать соответсвующий delete
В отличие от операции new, для которой можно определить разные модификации в зависимости от числа и типов аргументов, операция delete существует только в единственном варианте:
void operator delete (void* addr);
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
07.07.2011, 19:47 #34
то что ты написал никак не противоречит моему утверждению, а оно такого:
если выделял new[] то удаляй delete[]
если выделял new то удаляй delete
а в ссылке которую ты привёл речь идёт об определении собственных new и delete
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
07.07.2011, 19:48 #35
kravam, ага, щас... Для каждого new надо вызывать соответствующий delete. Создали одиночную область памяти с помощью new - вызвали delete, создали массив с помощью new [] - обязательно надо вызвать delete [].
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
07.07.2011, 19:53  [ТС] #36
ОК, не покажешь, где описан пример использования delete так
C++
1
delete p;
Я вот искал-искал и не нашёл, а что нашёл, так получается не то.

Добавлено через 1 минуту
И ещё я могу книжки назвать, где это не описано.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
07.07.2011, 19:55 #37
kravam,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
class Foo
{
public:
    virtual void vfunc() const
    {
        std::cout << "Foo::vfunc()" << std::endl;
    }
};
 
class Bar : public Foo
{
public:
    virtual void vfunc() const
    {
        std::cout << "Bar::vfunc()" << std::endl;
    }
};
 
int main()
{
    Foo *f1 = new Foo ();
    Foo *f2 = new Bar ();
 
    f1->vfunc();
    f2->vfunc();
 
    delete f1;
    delete f2;
 
    return 0;
}
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
07.07.2011, 19:56 #38
а чё там может не получится? исключений delete вроде как не вызывает, главное чтобы указатель был валидным, можно и нулевой
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
07.07.2011, 20:12  [ТС] #39
silent_1991, чё уж так-то уж, я ведь и сам мог delete p написать и компильнуть. Я просил пример из учебника какого-нибудь.
Но как-бы то ни было, у Павловской я нашёл, что да, можно delete p, а можно delete [] p;
При чём строго-настрого сказано, что если память выделена под массив, то надо второй вариант.
Иначе удалится только память под первый объект, да это и так понятно.

Но подобных строгих ограничений не наложено если память выделена под один элемент. int * p= new x;
То есть сказано, что надо освободить так: delete p.
Я тут думал-думал чё страшного может произойти, если я буду писать delete [] p чё и никак не придумал. Ничего.

Но так-то я чел дисциплинированный, сказано писать без квадратных скобок, буду писать без квадратных скобок. Дабы приучать себя к порядку.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
07.07.2011, 20:17 #40
Цитата Сообщение от kravam Посмотреть сообщение
Я тут думал-думал чё страшного может произойти, если я буду писать delete [] p чё и никак не придумал. Ничего.
За тебя это страшное вполне могут придумать создатели компилятора
Т.к. в стандарте говорится, что удаление массива с помощью delete, как и удаление одиночного объекта с помощью delete [] это "behavior is undefined"
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
07.07.2011, 20:17 #41
kravam, а, ну раз вы ничего не придумали, ничего, то да, пишите как удобно. А можно вообще память не освобождать, программа ведь и так работает.
0
asics
Freelance
Эксперт С++
2847 / 1782 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
07.07.2011, 20:18 #42
Цитата Сообщение от kravam Посмотреть сообщение
Иначе удалится только память под первый объект, да это и так понятно.
Посмотри.

Не по теме:

уже ответили...

1
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
07.07.2011, 20:33  [ТС] #43
silent_1991,
Цитата Сообщение от pito211 Посмотреть сообщение
а чё там может не получится? исключений delete вроде как не вызывает, главное чтобы указатель был валидным, можно и нулевой
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2011, 20:33
Привет! Вот еще темы с ответами:

Создайте класс, в котором есть ostream& operator<<. Класс должен содержать очередь с приоритетом - C++
Создайте класс, в котором есть ostream&amp; operator&lt;&lt;. Класс должен содержать очередь с приоритетом. Создайте генератор — заполнитель очереди...

Как преобразовать указатель на класс к указателю на асбтрактный класс? - C++
Но тут есть одна тонкость- два промежуточных класса. Вот код, надеюсь всё из него понятно. #include &lt;stdio.h&gt; ...

Как создать класс со вложенной структурой указателей на класс? - C++
В классе Concept хранится массив (точнее map) структур Rel. Сама же структура Rel должна содержать указатели на класс Concept. ...

Разработать производный от абстрактного класса Figure класс и класс, производный от производного - C++
Разработать базовый абстрактный класс Figure с пустым виртуальным методом print для вывода в дальнейшем полной информации об объекте: ...


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

Или воспользуйтесь поиском по форуму:
43
Yandex
Объявления
07.07.2011, 20:33
Ответ Создать тему
Опции темы

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