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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
#1

есть вложенный класс который является другом объемлюющего и всё это должно компилиться. - C++

29.06.2011, 16:01. Просмотров 1613. Ответов 36
Метки нет (Все метки)

Сперва логика:
Есть класс matrix. И есть класс diagonal; так я поразмыслил и пришёл к выводу, что объект diagonal в отрыве от объекта matrix существовать не может и поэтому сделал diagonal вложенным в matrix

Кроме того, класс diagonal должен иметь доступ к полям matrix, поэтому вложенный класс друг для объемлюющего

Наконец вся эта херь- шаблон.

Два вопроса поэтому. Как сие реализовать?

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
//Опережающее объявление
template< typename T >
class diagonal;
 
 
template <class T>
class matrix {
 public:
  friend class diagonal<T>;
 private:
  //Тут вот приватные поля, к ним класс диагональ должен иметь доступ
};
 
 
//Короче тут я не могу компильнуть никак
template <class T>
class matrix<T>::diagonal {
 public:
  diagonal (){
  //ЗДесь код с доступом  к закрытым полям класса matrix
  }
};
 
 
int main () {
 matrix <int> k;
 //matrix<int>::diagonal di;
}
;ругается на определение класса diagonal

И второе: я хочу чтобы при объявлении класса diagonal было видно: ага этот объект принадлежит
такому-то объекту класса matrix (такой-то матрице; то есть не просто гипотетическому классу
matrix, а конкретной матрице; вот не так вот
C++
1
  matrix<int>::diagonal di;
А как-то так, что ли
C++
1
k.diagonal di;
)спасибо, кто поможет. Реагировать только на реализацию!

Добавлено через 19 часов 55 минут
Никто не знает?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2011, 16:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос есть вложенный класс который является другом объемлюющего и всё это должно компилиться. (C++):

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? - C++
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

Зависает программа, хотя используется BeginInvoke, и всё должно считаться в другом потоке - C#
У меня есть программа которая моделирует физ процесс, иногда делает это долго, чтобы на форму не ставилось Программа не отвечает, решил...

Как связать всё это друг с другом? - FoxPro
По методичке создала базу данных. По второй методичке создала формочку, кнопочки. Формочка из текстбокс, кнопки перехода от одной...

Является ли это ОО кодом? Что должно быть в protected? - ООП и паттерны
Добрый день. Пара вопросов есть. Первый вопрос. Есть класс, который в private содержит объекты других классов, те в свою очередь тоже...

Вложенный запрос вернул больше одного значения Это запрещено, когда вложенный запрос следует после =, !=, <, < - SQL Server
Здравствуйте,проблема вот в чем,при добавление записи в таблицу,первая запись добавляется,а при добавление второй выдает что &quot;вложенный...

Сделать класс Car который является наследник от AComponent - C#
Суть задачи, сделать некий класс Car который является наследник от AComponent AComponent – это абстрактный класс, который реализует...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 16:22 #2
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
template <class T>
class matrix {
    
    friend class diagonal;
 
 public:
  class diagonal; //Вложенный класс
  
 private:
  
};
 
 
 
template <class T>
class matrix<T>::diagonal {
 public:
  diagonal (){
 
  }
};
 
 
int main () {
 matrix <int> k;
 
}
Добавлено через 2 минуты
Цитата Сообщение от kravam Посмотреть сообщение
А как-то так, что ли
k.diagonal di;
чё значит di? такую конструкцию не сожрёт компилятор

Добавлено через 3 минуты
в диагонале же у тебя будут элементы храниться? а поскольку пользователям такой класс(diagonal) думаю нафиг не нужен, то все его данные можно сделать публичными, а сам класс при этом спрятать в приватную секцию матрицы. Тогда не придётся ничего френдить

Добавлено через 7 минут
естественно это не могло скомпилироваться. Эта запись подразумевает, что диагональ вложена в матрицу, а у тебя она просто зафрендена
Цитата Сообщение от kravam Посмотреть сообщение
class matrix<T>::diagonal
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
29.06.2011, 16:46  [ТС] #3
Нет, мне нужен класс диагональ, он для пользователя. Например, я хочу так сделать:
C++
1
2
diagonal di;
di [1]= 34;//или (di [1]= 34;)
Это будет значить: элементу номер один диагонали присвоить значение 34; о нумерации можно будет условиться, например, с левого верхнего угла в правый верхний угол.

...Ну вроде всё, единственно, класс диагональ должен как бы принадлежать классу matrix, чтобы это было видно при объявлении di, как-то так:
C++
1
k.diagonal di;//где k объект типа matrix
А то, что такую конструкцию не сожрёт компилятор, я знаю, я привёл её, чтобы показать, что примерно мне надо.

Вкратце: класс X должен и быть вложенным в другой класс Y и друг ему. Вот чё мне надо. Просто исходя из своего опыта и знаний скажите, что такое невозможно и я не буду пыхтеть зря (что делаю до сих пор) или в противном случае приведите пример реализации и я буду вам благодарен.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
29.06.2011, 16:54 #4
kravam, а что мешает сделать приватный вложенный класс diagonal и публичный (для класса matrix) объект класса diagonal?
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 16:57 #5
Цитата Сообщение от kravam Посмотреть сообщение
класс X должен и быть вложенным в другой класс Y и друг ему. Вот чё мне надо.
в листинге выше он и друг и вложенный.

Цитата Сообщение от kravam Посмотреть сообщение
Нет, мне нужен класс диагональ, он для пользователя
пользователям класс диагональ точно не потребуется, по сути это обыкновенный массив. Не думаю что кто предпочтёт пользоваться диагональю по сравнению с стлвкими контейнерами.

в чём кстати смысл данной задумки?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.06.2011, 17:01 #6
Не проще ли объект дигонали сделать членом класса матрицы? У каждой матрицы есть диагональ, по-моему вполне логично.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
29.06.2011, 18:15  [ТС] #7
pito211, прошу прощенья.

Короче так вот пока у меня.
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
template <class T>
class matrix {
        
        friend class diagonal;
 
 public:
  class diagonal; 
  
 private:
  
};
 
 
template <class T>
class matrix<T>::diagonal {
 public:
  diagonal (matrix&, int){
  }
};
 
 
int main () {
 matrix <int> m;
 
 //Единственное, что я мог придумать: показать, что объект di не сам по себе, но принадлежит "m" (диагональ принадлежит матрице)
 matrix <int>::diagonal di(m, 6);
}
Ну так-то ни в чём смысл, просто сделаю класс matrix и пусть он у меня будет и буду решать практические задачи.
Я часто вижу на этом форуме: диагональ там, диагональ сям. Решил сделать её отдельной сущностью, например чтобыбы брать её элементы, как я уже показал. (кстати, планирую в ней массив не хранить, а вычисления типа:
C++
1
 di[5]= 34;
производить "на ходу", перегрузка оператора [] она должна обращаться к классу "marix", где все эти элементы и хранятся и высчитывать, какой из них пятый и брать его значение и возвращать на него ссыль. Думаю, это оправдано, ведь если хранить в диагонили ветор, то при изменении матрицы, придётся менять и диагональ (необходимый элемент вектора, это плохо) И да, конечно, у кажой диагонали будет номер, например, в матрице 2X3 их 4, в конструкторе disgonal он будет вторым параметром)


Но, конечно, в самом начале хоть запроектируйся, корректировки придётся мощные вносить в процессе работы и я ещё могу сто раз всё переделать и реализовать ваши идеи. У меня уже не раз такое было.
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 18:41 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
первое место на конкурсе быдлокода гарантированно
3
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
29.06.2011, 19:28  [ТС] #9
Ну так какой я, такой и код. Босота и есть.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.06.2011, 19:53 #10
kravam, прислушайтесь к тому, что вам говорят. Отдельный объект "диагональ" нафиг не нужен, зачем плодить лишние сущности? Лучше перегрузите оператор () в матрице так, чтобы он принимал один параметр и возвращал элемент на диагонали с этим индексом, если уж очень хочется работать именно с диагональю. Ну а вообще, как по мне, так [i][i] вооообще не утруждает...
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
29.06.2011, 20:21  [ТС] #11
А вообще откуда такая уверенность- нужен- не нужен? Это МОЙ класс. И мне виднее, чё там нужно, а чё нет. Вы же не знаете, какие мне приходится решать задачи, может, у меня исключительно диагональные матрицы.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.06.2011, 20:27 #12
kravam, тогда наследуйте свои исключительно диагональные матрицы от обычных и радуйтесь. Но класс "диагональ" - это извините меня...
0
Bers
Заблокирован
29.06.2011, 20:27 #13
kravam, назовите мне причину, оправдывающую существование нового (очередного) класса в программе?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
29.06.2011, 20:40  [ТС] #14
Удобность интерфейса, например если мне удастся сделать класс диагональ, то будет так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Оъявление посложнее будет, чем здесь
diagonal di_0, di_1;
 
//Но всё остальное достаточно просто; понятно, что характеристикой каждой матрицы будет
//к кому она принадлежит и индекс, начиная, допустим с левого верхнего угла
 
//Это ссыли на матрицу и номер диагонали 
di_0(m, 8);
di_1(m__, 10);
 
//А вот пошли пользовательские операции
di_0[2]= 45;
di_0.swap(di_1)
di_0.swap(5, 6);
0
Bers
Заблокирован
29.06.2011, 21:35 #15
kravam, по моему скромному мнению, единственная причина, которая оправдывает существование нового класса (функции/модуля/библиотеки/системы) - это облегчение жизни программиста.

Абстракция - суть механизм управления сложностью проекта.
Вы создаёте очередной слой абстракции, что бы понизить уровень сложности. И это - единственная причина его существования.

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

Потеря контроля над сложностью проекта - серьёзный риск перестать контролировать ситуацию в проекте. И как следствие - многочисленные глобальные переделки больших кусков кода. Потери во времени на отладку и сопровождение.

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

Иначе вы рискуете оказаться не командным игроком (не востребованным)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2011, 21:35
Привет! Вот еще темы с ответами:

Виснет весь ПК из-за процесса который невозможно закрыть и который ест всё ЦП моего пк. - Удаление вирусов
Виснет весь ПК из-за процесса который невозможно закрыть и который ест всё ЦП моего пк. Всё началось недавно когда я попытался включить...

this это адресс объекта, а *this это сам объект. я всё правельно понял? - C++
this это адресс объекта, а *this это сам объект. я всё правельно понял?

есть 2 виртуальных инструмента,надо чтобы когда на одном меняли value чтобы и стрелка и на другом менялась и это используя rmi - Java
Привет. У меня паника! помогите мне пожааааалуйста. есть 2 виртуальных инструмента,надо чтобы когда на одном меняли value чтобы и...

Есть класс Точка. Написать метод, который будет рисовать точку на форме - C#
Есть класс Точка. Написать метод, который будет рисовать точку на форме. class Point { public int X { set; get; } ...


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

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

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