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

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

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

Недавно начал изучение С++, в частности ООП. В связи с чем у меня есть вопрос как в главном классе можно создать указатель на экземпляр другого класса, причем такой, чтоб во всех экземплярах главного класса был один и тот же указатель. То есть существует много экземпляров главного класса, все указатели которого указывают на единственный экземпляр другого класса.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2013, 16:05
Ответы с готовыми решениями:

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

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

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

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

20
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
07.09.2013, 16:22 2
При создании каждого экземпляра "главного" класса передавать ему адрес того самого экземпляра.
0
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;
    ...
};
0
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 байт, 6 просмотров)
0
What a waste!
1606 / 1298 / 180
Регистрация: 21.04.2012
Сообщений: 2,724
07.09.2013, 17:39 5
Teplotexnik, нужно определение B::ptr (в исходнике):
C++
1
A * B::ptr = /* init-value */;
1
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 байт, 7 просмотров)
0
What a waste!
1606 / 1298 / 180
Регистрация: 21.04.2012
Сообщений: 2,724
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 */;
};
0
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>          В результате преобразования теряются квалификаторы
0
What a waste!
1606 / 1298 / 180
Регистрация: 21.04.2012
Сообщений: 2,724
07.09.2013, 19:13 9
Цитата Сообщение от 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  [ТС] 10
Да, тот код тоже не компилируется видимо это зависит от компилятора( а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
0
What a waste!
1606 / 1298 / 180
Регистрация: 21.04.2012
Сообщений: 2,724
07.09.2013, 19:29 11
Цитата Сообщение от Teplotexnik Посмотреть сообщение
тот код тоже не компилируется
Что-то делаешь не так. Ошибки какие?
Цитата Сообщение от Teplotexnik Посмотреть сообщение
а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
Я знаю, что такое shared_ptr; зачем нужен статический счётчик?
0
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 ==========
0
14 / 14 / 1
Регистрация: 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
0
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 20:01  [ТС] 14
gray_fox, этот счетчик нужен для подсчета колличества созданных указателей на хранилище
fit, вопрос был как отказаться от статического указателя, но при этом чтобы указатели всех экземпляров этого класса ссылались на единсвенный экземпляр класса хранилище
0
What a waste!
1606 / 1298 / 180
Регистрация: 21.04.2012
Сообщений: 2,724
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;
};
0
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:10 16
Цитата Сообщение от gray_fox
Инициализируй в конструкторах
тогда каждый объект SharedPtr будет ссылаться на отдельное хранилище Storage. а надо, чтобы на одно.
не понимаю чем автору не нравится статический указатель. он для таких целей и существует))
0
What a waste!
1606 / 1298 / 180
Регистрация: 21.04.2012
Сообщений: 2,724
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()) {}
0
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?
0
What a waste!
1606 / 1298 / 180
Регистрация: 21.04.2012
Сообщений: 2,724
08.09.2013, 00:07 19
Цитата Сообщение от 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 20
Цитата Сообщение от Teplotexnik
потому что все статически определенные объекты и поля как глобальные переменные создаются самыми первыми и могут создаться до того, как будут определены
а что в этом страшного? определяете-то значение поля вы все равно сами. и сделать это надо будет всего один раз. ну можно еще объявить как private на всякий пожарный. ощущение такое, велосипед изобретаете)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2013, 02:02

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

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

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

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

Создать в главном классе метод генерации
Доброго времени суток. Я создал в классе Cat конструктор так, чтобы можно было создать кошку с...

Обращение к методам класса через указатель на экземпляр класса
Добрый день. Не могу осилить проблему: Описан абстрактный класс. Описаны наследники этого...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru