Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
#1

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

29.06.2011, 16:01. Просмотров 1698. Ответов 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++):

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

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

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

Является ли это ОО кодом? Что должно быть в protected?
Добрый день. Пара вопросов есть. Первый вопрос. Есть класс, который в...

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

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

36
pito211
186 / 173 / 18
Регистрация: 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
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
29.06.2011, 16:54 #4
kravam, а что мешает сделать приватный вложенный класс diagonal и публичный (для класса matrix) объект класса diagonal?
0
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 16:57 #5
Цитата Сообщение от kravam Посмотреть сообщение
класс X должен и быть вложенным в другой класс Y и друг ему. Вот чё мне надо.
в листинге выше он и друг и вложенный.

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

в чём кстати смысл данной задумки?
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.06.2011, 17:01 #6
Не проще ли объект дигонали сделать членом класса матрицы? У каждой матрицы есть диагональ, по-моему вполне логично.
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 18:41 #8
Лучший ответ Сообщение было отмечено как решение

Решение

первое место на конкурсе быдлокода гарантированно
3
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
29.06.2011, 19:28  [ТС] #9
Ну так какой я, такой и код. Босота и есть.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
29.06.2011, 19:53 #10
kravam, прислушайтесь к тому, что вам говорят. Отдельный объект "диагональ" нафиг не нужен, зачем плодить лишние сущности? Лучше перегрузите оператор () в матрице так, чтобы он принимал один параметр и возвращал элемент на диагонали с этим индексом, если уж очень хочется работать именно с диагональю. Ну а вообще, как по мне, так [i][i] вооообще не утруждает...
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
29.06.2011, 20:21  [ТС] #11
А вообще откуда такая уверенность- нужен- не нужен? Это МОЙ класс. И мне виднее, чё там нужно, а чё нет. Вы же не знаете, какие мне приходится решать задачи, может, у меня исключительно диагональные матрицы.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
29.06.2011, 20:27 #12
kravam, тогда наследуйте свои исключительно диагональные матрицы от обычных и радуйтесь. Но класс "диагональ" - это извините меня...
0
Bers
Заблокирован
29.06.2011, 20:27 #13
kravam, назовите мне причину, оправдывающую существование нового (очередного) класса в программе?
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
29.06.2011, 21:52  [ТС] #16
По-моему у меня код как раз упрощается. Конечный, конечно, код.

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

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

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

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

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

Вот не у кого же не хватает ума залезть в исходники того же STL и прочая. Вы уверены, что их реализация вас устроит? А ко мне лезут, не просишь, а лезут. Выдам на-гора конечный продукт, тогда лезьте.
Но я сам виноват, не буду без надобности выкладывать проекты тем более сырые. Они мне слишком тяжело даются для этого.
...А так-то да, игрок я не командный потому, что я самоучка.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 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
*/
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.06.2011, 10:15 #20

Не по теме:

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


По теме, раз диагональ так нужна в виде отдельной сущности, то эту диагональ надо либо возвращать в методе класса матрицы, либо делать диагональ членом класса матрицы, а не так, чтобы диагональ жила отдельно от матрицы.
1
30.06.2011, 10:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2011, 10:15
Привет! Вот еще темы с решениями:

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

Виснет весь ПК из-за процесса который невозможно закрыть и который ест всё ЦП моего пк.
Виснет весь ПК из-за процесса который невозможно закрыть и который ест всё ЦП...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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