Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 16:05     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #1
Недавно начал изучение С++, в частности ООП. В связи с чем у меня есть вопрос как в главном классе можно создать указатель на экземпляр другого класса, причем такой, чтоб во всех экземплярах главного класса был один и тот же указатель. То есть существует много экземпляров главного класса, все указатели которого указывают на единственный экземпляр другого класса.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2013, 16:05     Работа с классами (в главном классе создать указатель на экземпляр другого класса)
Посмотрите здесь:

Объявление в классе объекта другого класса C++
C++ указатель на экземпляр шаблонного класса
Создание экземпляр класса из другого класса C++
Обращение к методам класса через указатель на экземпляр класса C++
C++ Указатель на экземпляр шаблонного класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
07.09.2013, 16:22     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #2
При создании каждого экземпляра "главного" класса передавать ему адрес того самого экземпляра.
alig007
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
07.09.2013, 16:27     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #3
сделать его статическим
C++ (Qt)
1
2
3
4
5
6
7
8
class A{
    ...
};
 
class B{
    static A *ptr;
    ...
};
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 16:57  [ТС]     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #4
Цитата Сообщение от Бендерродригез Посмотреть сообщение
При создании каждого экземпляра "главного" класса передавать ему адрес того самого экземпляра.
а как это реализовать
Цитата Сообщение от 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 байт, 2 просмотров)
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.09.2013, 17:39     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #5
Teplotexnik, нужно определение B::ptr (в исходнике):
C++
1
A * B::ptr = /* init-value */;
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 18:11  [ТС]     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #6
Цитата Сообщение от gray_fox Посмотреть сообщение
Teplotexnik, нужно определение B:tr (в исходнике):
C++
1
A * B::ptr = /* init-value */;
спасибо так работает, но хотелось бы попробовать не через статический указатель, а через создание в каждом объекте класса указателя на один объект класса, подскажите как сделать без статических определений.
Вложения
Тип файла: rar prog1.rar (869 байт, 2 просмотров)
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.09.2013, 18:16     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #7
Цитата Сообщение от 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 */;
};
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 19:02  [ТС]     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #8
когда пытаюсь сделать так
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>          В результате преобразования теряются квалификаторы
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.09.2013, 19:13     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #9
Цитата Сообщение от Teplotexnik Посмотреть сообщение
пределах класса могут быть инициализированы только статические константные данные-члены целого типа
Ну значит VS это не поддерживает, инициализируй в конструкторе.

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

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

Не по теме:

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

Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 19:22  [ТС]     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #10
Да, тот код тоже не компилируется видимо это зависит от компилятора( а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.09.2013, 19:29     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #11
Цитата Сообщение от Teplotexnik Посмотреть сообщение
тот код тоже не компилируется
Что-то делаешь не так. Ошибки какие?
Цитата Сообщение от Teplotexnik Посмотреть сообщение
а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
Я знаю, что такое shared_ptr; зачем нужен статический счётчик?
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 19:54  [ТС]     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #12
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 ==========
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 19:57     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #13
агрегация по ссылке это называется. а чтобы "во всех экземплярах главного класса был один и тот же указатель" переменную-указатель надо сделать статической. статическая переменная является общей для всех объектов класса, к которому она относится. пример:

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
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 20:01  [ТС]     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #14
gray_fox, этот счетчик нужен для подсчета колличества созданных указателей на хранилище
fit, вопрос был как отказаться от статического указателя, но при этом чтобы указатели всех экземпляров этого класса ссылались на единсвенный экземпляр класса хранилище
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.09.2013, 20:05     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #15
Цитата Сообщение от Teplotexnik Посмотреть сообщение
type:tr: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
Инициализируй в конструкторах
C++
1
2
3
4
5
6
7
8
class SharedPtr {
 
public:
   SharedPtr() : ptr(new Storage()) {}
 
private:
   Storage * ptr;
};
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:10     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #16
Цитата Сообщение от gray_fox
Инициализируй в конструкторах
тогда каждый объект SharedPtr будет ссылаться на отдельное хранилище Storage. а надо, чтобы на одно.
не понимаю чем автору не нравится статический указатель. он для таких целей и существует))
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.09.2013, 21:23     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #17
Цитата Сообщение от fit Посмотреть сообщение
тогда каждый объект SharedPtr будет ссылаться на отдельное хранилище Storage. а надо, чтобы на одно.
не понимаю чем автору не нравится статический указатель. он для таких целей и существует))
я не знаю)
Цитата Сообщение от Teplotexnik Посмотреть сообщение
спасибо так работает, но хотелось бы попробовать не через статический указатель, а через создание в каждом объекте класса указателя на один объект класса, подскажите как сделать без статических определений.
Добавлено через 4 минуты
Т.е. видимо как то так:
C++
1
2
3
std::auto_ptr<Storage> const storage(new Storage);
 
SharedPtr::SharedPtr() : ptr(storage.get()) {}
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 23:50  [ТС]     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #18
Цитата Сообщение от fit Посмотреть сообщение
не понимаю чем автору не нравится статический указатель. он для таких целей и существует))
потому что все статически определенные объекты и поля как глобальные переменные создаются самыми первыми и могут создаться до того, как будут определены
Цитата Сообщение от gray_fox Посмотреть сообщение
Т.е. видимо как то так:
Код C++
C++
1
2
std::auto_ptr<Storage> const storage(new Storage);
SharedPtr::SharedPtr() : ptr(storage.get()) {}
это какой то встроенный класс auto_ptr?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 00:07     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #19
Цитата Сообщение от Teplotexnik Посмотреть сообщение
это какой то встроенный класс auto_ptr?
Да http://en.cppreference.com/w/cpp/memory/auto_ptr
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2013, 02:02     Работа с классами (в главном классе создать указатель на экземпляр другого класса)
Еще ссылки по теме:

О правилах хорошего тона в C++: изменение данных из private секции класса А в классе В через указатель C++
C++ Указатель на объект, или экземпляр класса?
Создать в классе поле типа другого класса C++

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

Или воспользуйтесь поиском по форуму:
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
08.09.2013, 02:02     Работа с классами (в главном классе создать указатель на экземпляр другого класса) #20
Цитата Сообщение от Teplotexnik
потому что все статически определенные объекты и поля как глобальные переменные создаются самыми первыми и могут создаться до того, как будут определены
а что в этом страшного? определяете-то значение поля вы все равно сами. и сделать это надо будет всего один раз. ну можно еще объявить как private на всякий пожарный. ощущение такое, велосипед изобретаете)
Yandex
Объявления
08.09.2013, 02:02     Работа с классами (в главном классе создать указатель на экземпляр другого класса)
Ответ Создать тему
Опции темы

Текущее время: 16:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru