Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731

Разъясните ситуацию с видимостью объекта

15.03.2017, 11:16. Показов 1178. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем узнал что внутри классов можно описывать структуры, подклассы и т.д. и т.п. Вроде удобно, решил использовать это.

При попытке использоании объекта структуры struct1 в структуре struct2 внутри класса class1 пишет:
Нестатическая ссылка не член должна указываться относительно заданного объекта.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class class1{
private:
    struct struct1{
        int int1;
    }
    struct1 struct1_obj;
 
public:
    struct struct2{
        int func1(){
            return struct1_obj.int1; //ошибка struct1_obj
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2017, 11:16
Ответы с готовыми решениями:

Разъясните ситуацию с возвратом объекта или ссылки на объект
CValue my_f(15, false); CValue my_t(5, false); ... my_f = my_t + 2; Переопределение операторов сложения и...

Разъясните ситуацию с ссылками.
#include <iostream.h> void main(void) { int x=777; int &ir = x; double &dr=x; cout<<" x = "<<x<<endl; ...

Функция get() разъясните ситуацию
#include<iostream> #include<fstream> using namespace std; int main() { setlocale(LC_CTYPE, "russian"); char...

8
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
15.03.2017, 11:38
Цитата Сообщение от koker007 Посмотреть сообщение
Вроде удобно, решил использовать это.
Цитата Сообщение от koker007 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class class1{
private:
* * struct struct1{
* * * * int int1;
* * }
* * struct1 struct1_obj;
public:
* * struct struct2{
* * * * int func1(){
* * * * * * return struct1_obj.int1; //ошибка struct1_obj
* * * * }
* * }
}
Удобно возвращать методами первой структуры данные второй структуры????
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.03.2017, 11:44  [ТС]
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Удобно возвращать методами первой структуры данные второй структуры????
Да, если методы второй структуры специализируются только на возвращении, данных класса, а первая структура эти данные представляет, а конструктор класса эти данные заполняет.
Ну блин на то она и структура чтобы данные структурировать..
Просто если этого не делать то в методах класса будет самая настоящая помойка. Если методов over100500
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
15.03.2017, 11:53

Не по теме:


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



Добавлено через 4 минуты
koker007, ну, а если серьезно, то перечитайте основы.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,220
15.03.2017, 11:53
Лучший ответ Сообщение было отмечено koker007 как решение

Решение

Цитата Сообщение от koker007 Посмотреть сообщение
В общем узнал что внутри классов можно описывать структуры, подклассы и т.д. и т.п. Вроде удобно, решил использовать это.
При попытке использоании объекта структуры struct1 в структуре struct2 внутри класса class1 пишет:
Нестатическая ссылка не член должна указываться относительно заданного объекта.
Ым... Одни классы внутри других вы можете объявлять сколько угодно. Но это будет влиять лишь на имя вложенного класса и на права его доступа к полям охватывающего класса. Все.

В остальном эти классы - совершенно независимы, точно так же, как если бы они были объявлены отдельно, "обычным" образом. Как обычно, для доступа к полю объекта нужен доступ к самому объекту, содержащему это поле. Где он у вас? Поэтому к какому полю struct1_obj вы пытаетесь доступаться - не ясно.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.03.2017, 11:58
А с чего бы struct2 должна что-то знать о class1 и уж тем более о другой структуре?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class class1 {
private:
    struct struct1 {
        int int1;
    } struct1_obj;
 
public:
    struct struct2 {
        int func1(class1 *p) {
            return p->struct1_obj.int1;
        }
    } struct2_obj;
};
 
int main()
{
    class1 c;
    c.struct2_obj.func1(&c);
}
Добавлено через 40 секунд
Но это изврат
1
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.03.2017, 12:21  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
эти классы - совершенно независимы, точно так же, как если бы они были объявлены отдельно, "обычным" образом.
Спасибо. Теперь понятно как она все это видит. Я думал что раз структура2 объявлена ниже объекта структуры1 то она должна его видеть. По этому я и не понял почему он жалуется. Вроде понял.. )
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,220
15.03.2017, 12:36
Цитата Сообщение от koker007 Посмотреть сообщение
должна его видеть
Оно то может и видимо. Но к вопросу "видимости" данная проблема вообще никакого отношения не имеет.

Доступ к полю field некоего объекта в С++ всегда осуществляется через сам объект, при помощи операторов . или ->: либо obj.field, либо ptr->field. Единственным исключением из этого правила является доступ к полю класса из метода этого класса, где можно писать просто field - такая запись является сокращенной формой записи для this->field.

У вас в примере доступ к полю struct1_obj делается без использования операторов . или ->. Это значит, что вы могли иметь в виду только this->struct1_obj. Но тип this в методе class1::struct2::func1 - это class1::struct2 *. В классе class1::struct2 нет поля по имени struct1_obj. Поэтому и доступ к нему через this->struct1_obj невозможен.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
15.03.2017, 12:51
Пример, почему так делать нельзя:
C++
1
2
class1::struct2 s;
int n = s.func1(); // <-- что вернет, если экземпляр class1 мы не создавали?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.03.2017, 12:51
Помогаю со студенческими работами здесь

Разъясните ситуацию с SP1
Решил установить SP1, установил (установка прошла успешно) После очистки, дефрагментации обьем остался таким, как и до установки. Вопрос:...

Разъясните ситуацию с исключениями
Добрый вечер. Написал код для сортировки массива случайных чисел. Все работало отлично. Но когда я захотел добавить исключения при вооде...

Разъясните ситуацию с регулярным выражением (пример выкладываю)
Почему код ниже выводит: true true Ведь &quot;12345&quot; не содержит букв. public class ForRegexTest { public static void...

Проблема с видимостью объекта класса из функции
Здравстуйте! Работаю со связкой QT+KDevelop. В функции main создается и отображается объект-основная форма. Программа работает с CAN-сетью....

Управление видимостью объекта в зависимости от выбора RadioButton
как сделать, чтобы когда ставим флажок элемент на форме скрывался, а когда убираем флажок элемент появлялся?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru