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

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

07.09.2013, 16:05. Показов 5644. Ответов 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
Ответ Создать тему
Новые блоги и статьи
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