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

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

14.07.2015, 14:08. Показов 1283. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
18.07.2015, 16:29
я не уверен, что правильно понял вопрос, но кажись friend-декларации должны помочь в проблеме видимости protected-мемберов. другое дело, почему find седелали внешней функцией. по смысло ее можно включить в ListContainer (поддерживаю предыдущих ораторов)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru