Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/26: Рейтинг темы: голосов - 26, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25

Работа с классами (в главном классе создать указатель на экземпляр другого класса)

07.09.2013, 16:05. Показов 5729. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно начал изучение С++, в частности ООП. В связи с чем у меня есть вопрос как в главном классе можно создать указатель на экземпляр другого класса, причем такой, чтоб во всех экземплярах главного класса был один и тот же указатель. То есть существует много экземпляров главного класса, все указатели которого указывают на единственный экземпляр другого класса.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2013, 16:05
Ответы с готовыми решениями:

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one class two class main... Нужно...

Как создать указатель на экземпляр класса?
как создать указатель на экземпляр любого класса на делфи

Как создать экземпляр внутреннего класса в родительском классе
Как создать экземпляр этого класса в статическом методе main. public class Parent { class Child {} public static void...

20
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
07.09.2013, 16:22
При создании каждого экземпляра "главного" класса передавать ему адрес того самого экземпляра.
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
07.09.2013, 16:27
сделать его статическим
C++ (Qt)
1
2
3
4
5
6
7
8
class A{
    ...
};
 
class B{
    static A *ptr;
    ...
};
0
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 16:57  [ТС]
Цитата Сообщение от Бендерродригез Посмотреть сообщение
При создании каждого экземпляра "главного" класса передавать ему адрес того самого экземпляра.
а как это реализовать
Цитата Сообщение от alig007 Посмотреть сообщение
сделать его статическим
C++ (Qt)
1
2
3
4
5
6
7
8
class A{
    ...
};
 
class B{
    static A *ptr;
    ...
};
Дело в том, что когда я делаю обьект статическим компилятор начинает ругаться
C++
1
2
3
4
5
6
7
8
9
 1>  Компиляция...
1>  Shared_ptr.cpp
1>  Создание кода...
1>  Компиляция...
1>  main.cpp
1>  Создание кода...
1>Shared_ptr.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""private: static class Storage * Shared_ptr::pObj" (?pObj@Shared_ptr@@0PAVStorage@@A)"
1>C:\Users\Ivan\documents\visual studio 2012\Projects\Lesson10\Debug\Lesson10.exe : fatal error LNK1120: эхЁрчЁх°хээ√ї тэх°эшї ¤ыхьхэЄют: 1
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Привожу еще файлы
Вложения
Тип файла: rar Prog.rar (68 байт, 6 просмотров)
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
07.09.2013, 17:39
Teplotexnik, нужно определение B::ptr (в исходнике):
C++
1
A * B::ptr = /* init-value */;
1
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 18:11  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Teplotexnik, нужно определение B:tr (в исходнике):
C++
1
A * B::ptr = /* init-value */;
спасибо так работает, но хотелось бы попробовать не через статический указатель, а через создание в каждом объекте класса указателя на один объект класса, подскажите как сделать без статических определений.
Вложения
Тип файла: rar prog1.rar (869 байт, 7 просмотров)
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
07.09.2013, 18:16
Цитата Сообщение от Teplotexnik Посмотреть сообщение
через создание в каждом объекте класса указателя на один объект класса, подскажите как сделать без статических определений.
Как то так:
C++
1
2
3
4
5
6
7
struct B {
 
   B() : ptr(/* init-value */) {}   // так во всех конструкторах
 
private:
   A * const ptr;
};
в С++11 можно так:
C++
1
2
3
4
class B {
 
   A * const ptr = /* init-value */;
};
0
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 19:02  [ТС]
когда пытаюсь сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Storage.h"
 
 
class Shared_ptr
{
public:
    
    Shared_ptr(int value);
    ~Shared_ptr();
 
private:
    Shared_ptr();
    const Storage *pObj=new Storage();
    static int count;
};
выдает кучу ошибок , в том числе
C++
1
2
3
c:\users\ivan\documents\visual studio 2012\projects\lesson10\lesson10\shared_ptr.h(13): error C2864: Shared_ptr::pObj: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
1>c:\users\ivan\documents\visual studio 2012\projects\lesson10\lesson10\shared_ptr.cpp(26): error C2662: Storage::InvStorage: невозможно преобразовать указатель "this" из "const Storage" в "Storage &"
1>          В результате преобразования теряются квалификаторы
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
07.09.2013, 19:13
Цитата Сообщение от Teplotexnik Посмотреть сообщение
пределах класса могут быть инициализированы только статические константные данные-члены целого типа
Ну значит VS это не поддерживает, инициализируй в конструкторе.

Добавлено через 2 минуты
Вот здесь работает, например: http://ideone.com/h5G0TO .

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Teplotexnik Посмотреть сообщение
C++
1
static int count;
Это что за shared_ptr такой? )

0
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 19:22  [ТС]
Да, тот код тоже не компилируется видимо это зависит от компилятора( а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
07.09.2013, 19:29
Цитата Сообщение от Teplotexnik Посмотреть сообщение
тот код тоже не компилируется
Что-то делаешь не так. Ошибки какие?
Цитата Сообщение от Teplotexnik Посмотреть сообщение
а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
Я знаю, что такое shared_ptr; зачем нужен статический счётчик?
0
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 19:54  [ТС]
C++
1
2
3
4
5
1>------ Построение начато: проект: delete, Конфигурация: Debug Win32 ------
1>  Исходный код.cpp
1>c:\users\ivan\documents\visual studio 2012\projects\delete\delete\исходный код.cpp(28): error C2864: type::ptr: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
1>c:\users\ivan\documents\visual studio 2012\projects\delete\delete\исходный код.cpp(32): error C2512: type: нет подходящего конструктора по умолчанию
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 19:57
агрегация по ссылке это называется. а чтобы "во всех экземплярах главного класса был один и тот же указатель" переменную-указатель надо сделать статической. статическая переменная является общей для всех объектов класса, к которому она относится. пример:

C++
1
2
3
4
5
6
7
8
9
class A
{
};
 
class B
{
  private:
    static A* objectA;
};
objectA - указатель на объект класса A. если не инициализировать его при создании объектов клаcса B, то он будет 0.

присвоить значение objectA можно, например, так:
C++
1
2
3
B b1=new B(); 
B b2=new B(); // b1 и b2 - экземпляры главного класса
A B::objectA = new A(); // b1 и b2 ссылаются на объект класса A, через общий указатель objectA
0
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 20:01  [ТС]
gray_fox, этот счетчик нужен для подсчета колличества созданных указателей на хранилище
fit, вопрос был как отказаться от статического указателя, но при этом чтобы указатели всех экземпляров этого класса ссылались на единсвенный экземпляр класса хранилище
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
07.09.2013, 20:05
Цитата Сообщение от Teplotexnik Посмотреть сообщение
type:tr: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
Инициализируй в конструкторах
C++
1
2
3
4
5
6
7
8
class SharedPtr {
 
public:
   SharedPtr() : ptr(new Storage()) {}
 
private:
   Storage * ptr;
};
0
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:10
Цитата Сообщение от gray_fox
Инициализируй в конструкторах
тогда каждый объект SharedPtr будет ссылаться на отдельное хранилище Storage. а надо, чтобы на одно.
не понимаю чем автору не нравится статический указатель. он для таких целей и существует))
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
07.09.2013, 21:23
Цитата Сообщение от fit Посмотреть сообщение
тогда каждый объект SharedPtr будет ссылаться на отдельное хранилище Storage. а надо, чтобы на одно.
не понимаю чем автору не нравится статический указатель. он для таких целей и существует))
я не знаю)
Цитата Сообщение от Teplotexnik Посмотреть сообщение
спасибо так работает, но хотелось бы попробовать не через статический указатель, а через создание в каждом объекте класса указателя на один объект класса, подскажите как сделать без статических определений.
Добавлено через 4 минуты
Т.е. видимо как то так:
C++
1
2
3
std::auto_ptr<Storage> const storage(new Storage);
 
SharedPtr::SharedPtr() : ptr(storage.get()) {}
0
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 23:50  [ТС]
Цитата Сообщение от fit Посмотреть сообщение
не понимаю чем автору не нравится статический указатель. он для таких целей и существует))
потому что все статически определенные объекты и поля как глобальные переменные создаются самыми первыми и могут создаться до того, как будут определены
Цитата Сообщение от gray_fox Посмотреть сообщение
Т.е. видимо как то так:
Код C++
C++
1
2
std::auto_ptr<Storage> const storage(new Storage);
SharedPtr::SharedPtr() : ptr(storage.get()) {}
это какой то встроенный класс auto_ptr?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
08.09.2013, 00:07
Цитата Сообщение от Teplotexnik Посмотреть сообщение
это какой то встроенный класс auto_ptr?
Да http://en.cppreference.com/w/cpp/memory/auto_ptr
0
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
08.09.2013, 02:02
Цитата Сообщение от Teplotexnik
потому что все статически определенные объекты и поля как глобальные переменные создаются самыми первыми и могут создаться до того, как будут определены
а что в этом страшного? определяете-то значение поля вы все равно сами. и сделать это надо будет всего один раз. ну можно еще объявить как private на всякий пожарный. ощущение такое, велосипед изобретаете)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2013, 02:02
Помогаю со студенческими работами здесь

Как правильно создать экземпляр класса в классе контроллере
Давайте все объясню. Это пока что просто тест класса (FTPCClient) через Controller, который я написал. Не могу проинициализировать...

Создать экземпляр класса Graphics для метода в своём классе
Всем привет.Делаю графический редактор,нужно,чтобы отрисовывались на контроле picturebox линии из списка lines.Для этого создал класс...

Работа с уже сконструированными классами из другого класса
Народ всем привет. Возник hiccup. Пользуюсь VS2008 Есть основной класс и несколько дополнительных классов, В основном классе я...

Создать в классе поле типа другого класса
Как создать в классе поле типа string? Я пишу просто string Name, но компилятор ругается.

Как создать экземпляр класса внутри другого, явно не указывая его название
Как создать екземпляр класса внутри класса явно не указывая его название и не присваивая в переменную его название class Test{ ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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