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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
29.06.2011, 16:01     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #1
Сперва логика:
Есть класс 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 минут
Никто не знает?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2011, 16:01     есть вложенный класс который является другом объемлюющего и всё это должно компилиться.
Посмотрите здесь:

this это адресс объекта, а *this это сам объект. я всё правельно понял? C++
Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? C++
Есть производный класс и базовый; при чём производный использует только ЧАСТЬ ресурсов базового, правильно ли это? C++
C++ Вложенный шаблонный класс(разделение на файлы)
вложенный класс C++
C++ Вложенный класс
C++ вложенный класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
 Аватар для 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
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
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 и друг ему. Вот чё мне надо. Просто исходя из своего опыта и знаний скажите, что такое невозможно и я не буду пыхтеть зря (что делаю до сих пор) или в противном случае приведите пример реализации и я буду вам благодарен.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
29.06.2011, 16:54     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #4
kravam, а что мешает сделать приватный вложенный класс diagonal и публичный (для класса matrix) объект класса diagonal?
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 16:57     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #5
Цитата Сообщение от kravam Посмотреть сообщение
класс X должен и быть вложенным в другой класс Y и друг ему. Вот чё мне надо.
в листинге выше он и друг и вложенный.

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

в чём кстати смысл данной задумки?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.06.2011, 17:01     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #6
Не проще ли объект дигонали сделать членом класса матрицы? У каждой матрицы есть диагональ, по-моему вполне логично.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
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 он будет вторым параметром)


Но, конечно, в самом начале хоть запроектируйся, корректировки придётся мощные вносить в процессе работы и я ещё могу сто раз всё переделать и реализовать ваши идеи. У меня уже не раз такое было.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 18:41     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
первое место на конкурсе быдлокода гарантированно
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
29.06.2011, 19:28  [ТС]     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #9
Ну так какой я, такой и код. Босота и есть.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.06.2011, 19:53     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #10
kravam, прислушайтесь к тому, что вам говорят. Отдельный объект "диагональ" нафиг не нужен, зачем плодить лишние сущности? Лучше перегрузите оператор () в матрице так, чтобы он принимал один параметр и возвращал элемент на диагонали с этим индексом, если уж очень хочется работать именно с диагональю. Ну а вообще, как по мне, так [i][i] вооообще не утруждает...
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
29.06.2011, 20:21  [ТС]     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #11
А вообще откуда такая уверенность- нужен- не нужен? Это МОЙ класс. И мне виднее, чё там нужно, а чё нет. Вы же не знаете, какие мне приходится решать задачи, может, у меня исключительно диагональные матрицы.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.06.2011, 20:27     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #12
kravam, тогда наследуйте свои исключительно диагональные матрицы от обычных и радуйтесь. Но класс "диагональ" - это извините меня...
Bers
Заблокирован
29.06.2011, 20:27     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #13
kravam, назовите мне причину, оправдывающую существование нового (очередного) класса в программе?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
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);
Bers
Заблокирован
29.06.2011, 21:35     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #15
kravam, по моему скромному мнению, единственная причина, которая оправдывает существование нового класса (функции/модуля/библиотеки/системы) - это облегчение жизни программиста.

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

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

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

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

Иначе вы рискуете оказаться не командным игроком (не востребованным)
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
29.06.2011, 21:52  [ТС]     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #16
По-моему у меня код как раз упрощается. Конечный, конечно, код.

Добавлено через 3 минуты
Ради того, чтобы у меня был простой код в main, я делаю сложный код в классе. Может, неумело. Но это уже второй вопрос.
Bers
Заблокирован
29.06.2011, 21:54     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #17
Цитата Сообщение от kravam Посмотреть сообщение
По-моему у меня код как раз упрощается. Конечный, конечно, код.
По ВАШЕМУ

Тогда почему, другим участникам форума вас так трудно понять?

Не забывайтесь - если вы не один, то при написании кода вы должны учитывать то, как ваш код будут читать другие. Код должен быть максимально прост не только для вас, но и для других.
Иначе, вы - не командный игрок.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
29.06.2011, 22:11  [ТС]     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #18
Потому, что я стормозил. ТАК торможу я довольно редко. Блин, вчера глаза слипались и я создал такую тему вместо того, чтобы вот так спросить:

Вкратце: класс X должен и быть вложенным в другой класс Y и друг ему.

Просто. И не было бы этой бодяги.
Кстати, понять меня относительно легко при моём-то коде. Потому, что я работаю над тем, чтобы он был понятен. Пишу комменты, сокращаю до минимума делаю отступы и прочая. Согласиться с кодом- да, почему-то трудно.
Но-во-первых, я чисто и честно русским языком просил не лезть в логику проекта, а только в его реализацию, нет тут же посыпались советы. Во-вторых, пишу же русским языком: КОД СЫРОЙ.

Вот не у кого же не хватает ума залезть в исходники того же STL и прочая. Вы уверены, что их реализация вас устроит? А ко мне лезут, не просишь, а лезут. Выдам на-гора конечный продукт, тогда лезьте.
Но я сам виноват, не буду без надобности выкладывать проекты тем более сырые. Они мне слишком тяжело даются для этого.
...А так-то да, игрок я не командный потому, что я самоучка.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.06.2011, 22:18     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #19
Удобность интерфейса,
удобство это СТЛ) вот на протяжении учебного года жизнь заставила написать
matrix.h
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifndef MATRIX_H
#define MATRIX_H
 
#include <vector>
 
class Matrix {
 
    std::vector< std::vector<double> > matr;
 
public:
 
    Matrix(unsigned rows = 1, unsigned cols = 1, double fill = 0.0);
    Matrix(unsigned rows, unsigned cols, double (*func)(double,double));
    Matrix(const Matrix &);
 
    void resize(unsigned = 1, unsigned = 1, double = 0.0);
 
    unsigned Row() const { return matr.size(); }
    unsigned Col() const { return matr[0].size(); }
 
    double &       operator () (unsigned i, unsigned j);
    const double & operator () (unsigned i, unsigned j) const;
 
    Matrix         operator +  (const Matrix &) const;
    const Matrix & operator += (const Matrix & rhs);
 
    Matrix         operator -  (const Matrix &) const;
    const Matrix & operator -= (const Matrix & rhs);
 
    Matrix         operator *  (const Matrix &) const;
    const Matrix & operator *= (const Matrix & rhs);
 
    void RowExChange(unsigned i, unsigned j);
    void ColExChange(unsigned i, unsigned j);
 
    std::vector< double > GetRow            (unsigned i) const;
    std::vector< double > GetCol            (unsigned i) const;
    std::vector< double > GetDiagonal       (unsigned i, unsigned j) const; /* '\' */
    std::vector< double > GetBackDiagonal   (unsigned i, unsigned j) const; /* '/' */
 
    void SetRow              (unsigned i, const std::vector< double > &);
    void SetCol              (unsigned i, const std::vector< double > &);
    void SetDiagonal         (unsigned i, unsigned j, const std::vector< double > &);
    void SetBackDiagonal     (unsigned i, unsigned j, const std::vector< double > &);
 
    void SortRow             (unsigned i, const char c = '<'); // 1 2 3 4
    void SortCol             (unsigned i, const char c = '<');
    void SortDiagonal        (unsigned i, unsigned j, const char c = '<');
    void SortBackDiagonal    (unsigned i, unsigned j, const char c = '<');
 
    void RotateRow           (unsigned i, unsigned on, bool left = true);
    void RotateCol           (unsigned i, unsigned on, bool up = true);
    void RotateDiagonal      (unsigned i, unsigned j, unsigned on, bool left = true);
    void RotateBackDiagonal  (unsigned i, unsigned j, unsigned on, bool left = true);
 
};
 
#endif // MATRIX_H
 
/*
  GetDiagonal(3, 4) --> 1 2 3 4
  0 1 0 0 0
  0 0 2 0 0
  0 0 0 3 0
  0 0 0 0 4
  0 0 0 0 0
 
  GetBackDiagonal(3, 4) --> 1 2 3 4
  0 0 0 0 0
  0 0 0 0 4
  0 0 0 3 0
  0 0 2 0 0
  0 1 0 0 0
*/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2011, 10:15     есть вложенный класс который является другом объемлюющего и всё это должно компилиться.
Еще ссылки по теме:

шаблонный вложенный класс в .cpp C++
Вложенный (внутренний) класс (inner class) C++
C++ Обработка строк. Всё, что находится между /*...*/ не должно выводиться
C++ Шаблон, вложенный в него класс и оператор вывода
C++ Как это выражение должно выглядеть в c++?

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.06.2011, 10:15     есть вложенный класс который является другом объемлюющего и всё это должно компилиться. #20

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
Вот не у кого же не хватает ума залезть в исходники того же STL и прочая. Вы уверены, что их реализация вас устроит?
Почему же.. и вполне устраивает кстати.


По теме, раз диагональ так нужна в виде отдельной сущности, то эту диагональ надо либо возвращать в методе класса матрицы, либо делать диагональ членом класса матрицы, а не так, чтобы диагональ жила отдельно от матрицы.
Yandex
Объявления
30.06.2011, 10:15     есть вложенный класс который является другом объемлюющего и всё это должно компилиться.
Ответ Создать тему
Опции темы

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