Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 03.07.2014
Сообщений: 13

Видимость в классах

14.07.2015, 14:08. Показов 1306. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Убунту, стоит Code::Blocks IDE, стандартные настройки.

Есть два класса, первый
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template < typename T >
class ListenContainer
{
protected:
    class Knoten
    {
    public:
 
        T       data ;
        Knoten* next ;
        Knoten ( T const& argData, Knoten* argNext = NULL )
            : data( argData ), next( argNext )
        { }
    } ;
 
    Knoten* _first ;
    Knoten* _last ;
 
public:
// все остальное 
} ;


Второй:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
#include "ListenContainer.h"
template < typename T >
class SortListe
    : public ListenContainer<T>
{
public:
// проблема
} ;


Например во втором классе пишу следующее:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
T const* find ( T const& obj ) const
{       
        Knoten* lauf ;
        for( lauf = _first ; lauf != NULL ; lauf = lauf->next)
            if( obj < lauf->data || obj == lauf->data )
                break ;
 
        if( lauf != NULL && obj == lauf->data )
            return &lauf->data ;
 
        return NULL ;
}


Ошибки:
Кликните здесь для просмотра всего текста
error: ‘Knoten’ was not declared in this scope
‘lauf’ was not declared in this scope


Так же не находит _first и _last
В первом классе все работает без проблем.
Во втором нужно приписывать ListenContainer<T>:: перед каждым методом и атрибутом из второго.
Верхнюю функцию компилятор принимает только если во втором классе так же добавить класс Knoten и прочие ограничения.

Что бы понятнее, код, который можно запустить:
Работает, но не самое изящное решение
Второй класс
Кликните здесь для просмотра всего текста
C++ (Qt)
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
template < typename T >
class SortListe
    : public ListenContainer<T>
{
#if 1
class Knoten
    {
    public:
        T       data ;
        Knoten* next ;
 
        Knoten ( T const& argData, Knoten* argNext = NULL )
            : data( argData ), next( argNext )
        { }
    } ;
#endif // 0
 
public:
 
    T const* find ( T const& obj ) const
    {
 
        Knoten* lauf ;
 
 
        for( lauf = (Knoten*)(ListenContainer<T>::_first) ; lauf != NULL ; lauf = lauf->next)
            if( obj < lauf->data || obj == lauf->data )
                break ;
 
        if( lauf != NULL && obj == lauf->data )
            return &lauf->data ;
 
        return NULL ;
    }
// остальное
};


В VisualStudio такой проблемы нет.
Все папки, место и include проверялись неоднократно. При наведении курсора все распознается верно, но код не хочет запускаться. Что нужно сделать во втором классе, что бы просто напрямую использовать все методы и атрибуты, а не приписывать каждый раз ListenContainer<T>::

Пробовала GNU GCC Compiler и Intel C/C++ Compiler
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.07.2015, 14:08
Ответы с готовыми решениями:

Ограничения в классах C++
Ребят всем привет! В общем пишу курсовую работу на данную тему (ограничения в классах) и сейчас нахожусь в небольшом недоумении, читаю...

Приравнивание переменных в классах.
Почему нельзя в классе сразу после объявления переменной прировнять её к определенному значению? Нампример: AnsiString...

Видимость в классах
Дана программа #include&lt;iostream&gt; using namespace std; class a {protected: int a1; public: void fc() ...

5
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2015, 16:37
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
приписывать каждый раз ListenContainer<T>::
Делать это придется. Могут появиться некоторые специализации классов, которые переопределяют имена.
Срезать угол можно добавив в дочерний класс using ListenContainer<T>::first_; и using typename ListenContainer<T>::Knoten;
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
16.07.2015, 09:06
Лучший ответ Сообщение было отмечено Julia_Tallo как решение

Решение

Цитата Сообщение от 0x10 Посмотреть сообщение
Делать это придется. Могут появиться некоторые специализации классов, которые переопределяют имена.
Еще можно писать
C++
1
2
this->_first
this->_last
Julia_Tallo, и нижние подчеркивания вначале лучше не ставить (имена, начинающиеся с подчеркивания зарезервированы для различных расширений языка и библиотеки). Лучше в конце.

Добавлено через 14 минут
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
В VisualStudio такой проблемы нет.
Это потому, что в VS некоторые требования стандарта С++ не соблюдаются. Подробности:
http://blog.llvm.org/2009/12/d... ookup.html
http://www.codeproject.com/Art... rt-III-Two

Добавлено через 6 минут
Т.е. если объединить наши с 0x10 рекомендации, то код мог бы выглядеть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template < typename T >
class SortListe
    : public ListenContainer<T>
{
    using typename ListenContainer<T>::Knoten;
public:
    T const* find ( T const& obj ) const
    {
        Knoten* lauf ;
 
        for( lauf = this->_first; lauf != NULL; lauf = lauf->next)
            if( obj < lauf->data || obj == lauf->data )
                break;
 
        if( lauf != NULL && obj == lauf->data )
            return &lauf->data ;
 
        return NULL ;
    }
// остальное
};
2
17.07.2015, 16:53  [ТС]

Не по теме:

Спасибо большое! В других методах пошли уже такие пятиэтажные конструкции, что больше внимания пришлось уделять им, а не алгоритму.
С вашими подсказками значительно лучше и короче. Это то, что мне и нужно было.

Что касается нижнего подчеркивания в начале - не мое правило, не моя переменная. Нужно использовать именно в таком виде. Но для себя учту.

0
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
18.07.2015, 16:29
я не уверен, что правильно понял вопрос, но кажись friend-декларации должны помочь в проблеме видимости protected-мемберов. другое дело, почему find седелали внешней функцией. по смысло ее можно включить в ListContainer (поддерживаю предыдущих ораторов)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.07.2015, 16:40
Цитата Сообщение от grgdvo Посмотреть сообщение
я не уверен, что правильно понял вопрос, но кажись friend-декларации должны помочь в проблеме видимости protected-мемберов.
Этот вопрос касается вот этой темы в С++: Зависимые имена в шаблонах.
Видимость ограничивается из-за множества возможных потенциальных вариантов, возникающих при специализации базового класса. Так, _first и _last могут вообще исчезнуть из конкретной инстанции ListenContainer, зато могут появиться такие идентификаторы, например, в области видимости вне класса. Поэтому компилятор требует подтверждения в том, куда относятся эти имена, чтобы неявно не компилировать (потенциально некорректный) код.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2015, 16:40
Помогаю со студенческими работами здесь

Видимость переменных в наследуемых классах
Привет. Только начинаю изучать ООП. Public MustInherit Class MIClass Private i() As Integer Private Function f1(ByVal v As...

Видимость и не видимость кнопки на форме
Как, в Лазарус, сделать так, чтобы на форме кнопка сначала была не видна, а при наведении на то место, где должна быть кнопка она...

Определить какие из имён встречаются во всех классах, только в некоторых классах, не встречаются ни в одном
1. Заданный имена девочек . Определить , какие из этих имён встречаются во всех классах данной параллели , которые есть только в некоторых...

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

Заданы имена девочек. Определить, какие встречаются во всех классах, которые есть только в некоторых классах и какие не встречаются
Заданы имена девочек. Определить, какие из этих имен встречаются во всех классах данной параллели, которые есть только в некоторых классах...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru