crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Наследование
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
silver47 Дата 19.1.2011, 17:41
 
Цитата(Rocky @ 19.1.2011, 19:26) *
Это что имеется ввиду? Экземпляры классов создаются в конструкторе MainWidget?

Да, именно так.

Цитата(Rocky @ 19.1.2011, 19:26) *
Куда столько? с таблицами не путаете?

Нет, не путаю. 2 Базы - те над которыми работаем. Остальные две это мои кеши. Одна в памяти, для быстро меняющихся данных, другая - на локальном диске - для медленно меняющихся (работает как кеш браузера: сначала из кеша - потом снаружи).

Цитата(Rocky @ 19.1.2011, 19:26) *
Поэтому с т.з. проектирования лучше написать метод MainWidget::addComboBoxData(...) и т.п.

В этом проекте не вижу необходимости - лишь усложнит.

Цитата(Rocky @ 19.1.2011, 19:26) *
Для удобства можно обернуть их в отдельную структуру.

Не дорос ещё(самоучка), не знаю как сделать.

Итог: при малом количестве объектов - использовать передачу указателей на объекты, при бОльшем - передачу указателя на виджет.
Спасибо.
Rocky Дата 19.1.2011, 17:26
  Вот теперь точно непонял.
Цитата
Сколько закладок - столько классов, конструкторы которых находятся внутри конструктора MainWidget

Это что имеется ввиду? Экземпляры классов создаются в конструкторе MainWidget?

Имхо тут наследование вообще не нужно. Оно усложнит только. К тому же, насколько я понимаю, вообще намного более предпочтительней использовать указатель, чем наследование (указатель обернутый в какой-нить QPointer например, в зависимости от того, что нужно). Если __злоупотреблять__ наследованием - это лишнее расходовние памяти, ухудшение скорости работы программы, усложнение кода. Да и прямой доступ я бы вообще не стал давать к QComboBox и пр. Если MainWidget им владеет, значит только он должен знать, как и что туда добавлять. Поэтому с т.з. проектирования лучше написать метод MainWidget::addComboBoxData(...) и т.п.

Насчет БД... Куда столько? с таблицами не путаете? Это тоже не есть хорошо, когда у одной программы - 5-10 баз данных... Пусть хоть 10000 таблиц - но в одной базе.

По-поводу передачи указателей. Для удобства можно обернуть их в отдельную структуру. Если добавите/удалите какой-нить виджет/БД/еще что-нибудь придется переписывать конструкторы, добавлять новые переменные в классы, которые их будут использовать. А так в одном-двух местах подправил и все (занес в структуру и инициализировал). Масштабируемость какжется называется. Плюс читаемость лучше. Вобщем, мои мысли такие =)
igor_bogomolov Дата 19.1.2011, 17:22
 
Цитата(silver47 @ 19.1.2011, 16:17) *
Задача такая: есть класс MainWindow, зависящий от QWidget. Есть другой класс, к примеру MainTab, который ставиться в QTabWidget, расположенного на MainWindow.
Необходимо предоставить доступ из класса MainTab к элементам класса MainWindow. Хотел сделать, унаследовав MainTab от MainWindow.
теоритически, если бы такая конструкция была возможна, доступа до нужных вам данных вы бы не получили. Существующий MainWindow и тот что создастся при создании MainTab - это два разных объекта одного типа. Соответственно у каждого из них свой набор данных, никак не связанных (если конечно они не статические, что врят ли)

Решений можно придумать много. Можно передать указатель MainWindow в MainTab, и получать доступ к нужным данным через интерфейс MainWindow.
Можно, как ты и сделал, в конструкторе передавать необходимые данные. Если данных много, это может быть неудобным, тогда можно написать пару функций для передачи этих данных (что то типа setSqlDatabase).

P.S. И совет, учите с++. Название темы, как раз то с чего можно начать.
silver47 Дата 19.1.2011, 17:07
  Нет, Вы не поняли. MainWidget - это мой класс с главным окном. Помимо всего прочего на нем есть QTabWidget на котором на месте табов свои классы. Сколько закладок - столько классов, конструкторы которых находятся внутри конструктора MainWidget. На прилагаемом рисунке внешний вид приложения. То есть mainTab и другие табы создаются в конструкторе MainWindow, который и есть главное окно приложения. Необходим полный доступ к некоторым компонентам класса MainWindow таким как (QSqlDatabase, QComboBox). Их приличное количество (только открытых баз данных 3-4 штуки). Отнаследовать все классы табов от MainWidget не получилось, говорит что класс не указан. Передаю в конструкторе табов указатели на базы данных и необходимые компоненты. Считаю, что такой способ не самый худший, т.к. новые объекты не создаются, а создаются лишь указатели на них, но хочу услышать совет опытных.

P.S. для каждого таба свой класс решил сделать потому, что слишком сложное приложение по структуре получается (весь интерфейс пишу руками). Нарисовал главное окно и 2 вкладки > 1000 строк в MainWindow. Вкладок будет штук 6 и логика работы программы сложная - боюсь запутаться в > 10к строк
Rocky Дата 19.1.2011, 16:47
  А зачем MainTab-у наследоваться от QWidget, если MainWindow итак от него унаследован через QMainWidget?

Так получилось сделать или ругается? Если ругается, приведи больше кода тогда. А по-поводу передачи данных, я обычно так и делаю. Протаскиваю указатель на класс и через него уже получаю то, что нужно. Более извращенный вариант - создать один (или два) абстактных класса, и сделать их предками твоих классов. У наследников должна быть имплементация виртуальных методов базовых классов. Но от указателей никуда не деться. Правда они в этом случае уже будут не указателями на сами класс, а указателями на интерфейсы. Таким образом кроме тех функций, которые объявлены в базовых классах, твои классы ничего другого и знать не будут. Этот метод я использую, когда требуется вынести часть функционала в другую библиотеку например (в рамках одного проекта это делать имхо не следует). Хотя, вероятно, лучше было бы использовать механизм плагинов. Ну а так получается аналог COM по сути.
silver47 Дата 19.1.2011, 16:17
  Доброго времени суток.

Задача такая: есть класс MainWindow, зависящий от QWidget. Есть другой класс, к примеру MainTab, который ставиться в QTabWidget, расположенного на MainWindow.
Необходимо предоставить доступ из класса MainTab к элементам класса MainWindow. Хотел сделать, унаследовав MainTab от MainWindow.

maintab.h:
#include <QWidget>
#include "mainwindow.h"

class MainTab : public QWidget, public MainWindow
{
....
};


Но, получается множественное наследование от QWidget (и MainWindow и MainTab наследуются от QWidget)
переделываю на такое:
#include <QWidget>
#include "mainwindow.h"

class MainTab : public MainWindow
{
....
};

Ругается, что не указан класс до {

Сделал передачей указателей на необходимые элементы класса MainWindow в конструктор MainTab.

Вопрос: как следует это делать(не передачу указателя в конструкторе, а обращение к элементам одного класса из другого) правильно?

Спасибо.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 17:27