Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Область видимости вложенных классов, достучаться до родителя через указатель 
V
    Опции темы
SABROG
Дата 15.3.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Есть вот такой класс:

Код

class A
{
public:
A();
~A();
    class B
    {
    public:
        B();
        ~B();
        class C
        {
        public:
            C();
            ~C();
        }
    }
int var;
}


У меня в наличии только указатель на класс C. Как по этому указателю получить доступ к var ? Если я правильно понимаю, то вся эта вложенность классов не является наследованием и ни у одного из этих классов нет базового класса.

Такое вот не прокатывает, т.к. требуется наследование:

Код

A::B::C *p = &метод_который_возвращает_ссылку();
p->A::var = 1;


error: `A' is not a base of `A::B::C'

Зачем мне это надо. Хочу построить дерево с ограниченной глубиной, но чтобы не пришлось заводить переменную типа parent и была возможность возвращаться по дереву вверх.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 15.3.2008, 22:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Класс C знает о существовании класса A, но объект класса С о соответствующем объекте класса А не знает. Тебе придется заводить parent.
PM   Вверх
SABROG
Дата 15.3.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(bsa @ 15.3.2008,  22:04)
Класс C знает о существовании класса A, но объект класса С о соответствующем объекте класса А не знает. Тебе придется заводить parent.

Да, заподло, думал удасться через метод получить переменную, не тут то было

error: invalid use of nonstatic data member


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maxim1000
Дата 15.3.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



когда в описании класса пишется "int a", это означает, что каждый объект класса A будет содержать свою переменную "a"
теперь вопрос: к переменной "a" какого объекта ты хочешь получить доступ?

Это сообщение отредактировал(а) maxim1000 - 15.3.2008, 23:23


--------------------
qqq
PM WWW   Вверх
SABROG
Дата 15.3.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



С чего бы это каждому классу держать свою переменную a, если каждый из них базовый и никто никого не наследует ? Другое дело, что области видимости ограничены и вызов конструктора порождает вызов конструкторов классов, которые являются членами, но не потомками.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maxim1000
Дата 16.3.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(SABROG @  15.3.2008,  23:54 Найти цитируемый пост)
С чего бы это каждому классу держать свою переменную a

нет, каждый объект содержит переменную "a", не класс

Код

{
    A x,y;//создание двух объектов класса A
    x.a=1;//доступ к переменной "a" объекта "x"
    y.a=2;//доступ к переменной "a" объекта "y"
}

в этом примере x.a и y.a - две разные переменные


--------------------
qqq
PM WWW   Вверх
comcon1
Дата 16.3.2008, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Без parent - никак)) классу надо где-то хранить, чья он ветка дерева. Если это критично для оптимизации - выложи полный код, тебе помогут, где чО соптимизировать в другом месте.

ты можешь "достучаться" до var, только если объявишь ее static - тогда var будет одна на все экземпляры класса A и к ней можно будет обращаться как A::var. Вот. А по сабжу чем тебе не угодила структурка с parent:
Код

class A {
  private:
   int level;
   A* parent;
  public:
   explicit A(A* par): parent(par), level(par->getLevel()+1) { assert(level<3); }
   A(): parent(NULL), level(0) {;}
   int getLevel() const {return level;}
   A* getParent() const {return parent; }
   int var;
}

// ....

A point();
A p1(&point);
A p2(&point);
A p11(&p1);
p11.getParent()->getParent()->var;


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

Это сообщение отредактировал(а) comcon1 - 16.3.2008, 00:49


--------------------
PM MAIL   Вверх
bsa
Дата 16.3.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



преждевременная оптимизация очень вредна  smile 
PM   Вверх
SABROG
Дата 16.3.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Да, я смотрю тот еще геморрой. Поэтому пытаюсь перепроектировать классы. У меня сейчас есть класс, который содержит членом другой класс, а в нем около 20 своих членов, которые надо инициализировать. Через конструктор 20 параметров, я естественно, передавать не собираюсь, а потому инициализирую их вручную построчно. Но проблема в том, что в будущем, доступ на запись этих членов будет только через метод, а внутри обновление полей базы данных, соответственно их надо сделать приватными, но тогда, я не смогу их инициализировать из порождающего класса. Сейчас я прописал его как friend, чтобы получать доступ на запись не через методы для первичной инициализации. Есть еще мысль передать указатель на источник данных через конструктор, чтобы класс сам себя инициализировал, тогда friend не нужен. Как лучше поступить ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 16.3.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



SABROG, изменить дизайн. ты где-то очень серьезно накосячил, вот и возникают проблемы.
Как вариант, можно сделать инициализацию структурой - конструктору передается указатель на нее.
PM   Вверх
SABROG
Дата 16.3.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(bsa @ 16.3.2008,  13:09)
SABROG, изменить дизайн. ты где-то очень серьезно накосячил, вот и возникают проблемы.
Как вариант, можно сделать инициализацию структурой - конструктору передается указатель на нее.

Изначально класс и был той самой структурой, но из-за необходимости ввести ограничение в виде доступности к переменным только через методы, пришлось структуру преобразовать в класс. А теперь у меня есть метод вида "получить_значение_столбца_с_именем("описание")", который вызывается в цикле while и получает значения из базы данных и я уже распихиваю эти значения по разным классам, в зависимости от имени таблицы и типа колонки:

Код

A *p = new A;
p->note = получить_значение_столбца_с_именем("описание");
p->type = получить_значение_столбца_с_именем("тип");
...
и т.д. по 20 столбцам


Просто какой смысл тогда делать так?:

Код

struct sA
{
string note;
int type;
};
oA *poA = new poA;
poA->note = получить_значение_столбца_с_именем("описание");
poA->type = получить_значение_столбца_с_именем("тип");
A *p = new A(poA);
...
и т.д. по 20 столбцам




--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 17.3.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



так делать - никакого смысла.
Обычно, если структура содержит много полей, то это скорее всего просто неверно. Хотя бывают некоторые исключения. Например, когда для рассчета какого-то процесса требуется много входных данных. Чаще всего, эти данные - константы (читай настройки), которые берутся, например, из файла. Соответственно, должна быть одна функция, которая тупо загружает эту структуру и все.
В твоем случае, это не похоже на расчет сложного процесса. Неужели где-то требуются все данные сразу? Вряд ли. Соответственно, надо перегруппировать для начала. А там, возможно, и разделить.

Вобщем, я так думаю...
PM   Вверх
SABROG
Дата 17.3.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(bsa @  17.3.2008,  00:04 Найти цитируемый пост)
В твоем случае, это не похоже на расчет сложного процесса. Неужели где-то требуются все данные сразу?


Я кеширую базу данных размером в 10 мегабайт. А насчет расчета. Процесс может и не сложный, но на выходе будет до 1 миллиона цифр, и их формирование будет зависеть как раз от данных в базе. Если данные не будут предварительно загружены в память, то можно сразу 1 миллион умножать на количество запросов к базе данных...


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
comcon1
Дата 17.3.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



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


--------------------
PM MAIL   Вверх
bsa
Дата 17.3.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



SABROG, база данных, обычно, выглядит как несколько таблиц с наборами значений в каждой. Неужели в каждой таблице куча столбцов?
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0647 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.