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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
#1

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

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

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

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

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

указатель на экземпляр шаблонного класса - C++
имеется такой класс template <class Coord> class Elem { private: const Coord x, y; Elem *Prev; bool check; public: ...

Указатель на текущий экземпляр класса this - C++
Всем здрасьте. Например у меня есть класс: class A { // ... void B(); void C(); // ... }

Указатель на экземпляр шаблонного класса - C++
Есть шаблон класса template <typename TBase> class TArray { ... };, есть некие объекты TArray <A> a; TArray <A> b; TArray <A> c;,...

Указатель на объект, или экземпляр класса? - C++
Здравствуйте Уважаемые программисты! Недавно я начал изучать программирование с использованием С++. Ранее не программировал. В качестве...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
07.09.2013, 16:22 #2
При создании каждого экземпляра "главного" класса передавать ему адрес того самого экземпляра.
0
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;
    ...
};
0
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 ==========
Привожу еще файлы
0
Вложения
Тип файла: rar Prog.rar (68 байт, 2 просмотров)
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
07.09.2013, 17:39 #5
Teplotexnik, нужно определение B::ptr (в исходнике):
C++
1
A * B::ptr = /* init-value */;
1
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 */;
спасибо так работает, но хотелось бы попробовать не через статический указатель, а через создание в каждом объекте класса указателя на один объект класса, подскажите как сделать без статических определений.
0
Вложения
Тип файла: rar prog1.rar (869 байт, 2 просмотров)
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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 */;
};
0
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>          В результате преобразования теряются квалификаторы
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
07.09.2013, 19:13 #9
Цитата Сообщение от Teplotexnik Посмотреть сообщение
пределах класса могут быть инициализированы только статические константные данные-члены целого типа
Ну значит VS это не поддерживает, инициализируй в конструкторе.

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

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

Не по теме:

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

0
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 19:22  [ТС] #10
Да, тот код тоже не компилируется видимо это зависит от компилятора( а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
07.09.2013, 19:29 #11
Цитата Сообщение от Teplotexnik Посмотреть сообщение
тот код тоже не компилируется
Что-то делаешь не так. Ошибки какие?
Цитата Сообщение от Teplotexnik Посмотреть сообщение
а shared_ptr это класс, в котором содержится указатель на хранилище и колличество используемых в данный момент указателей на данное хранилище, когда не остается ни одного указателя хранилище должно разрушиться.
Я знаю, что такое shared_ptr; зачем нужен статический счётчик?
0
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 ==========
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
0
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
07.09.2013, 20:01  [ТС] #14
gray_fox, этот счетчик нужен для подсчета колличества созданных указателей на хранилище
fit, вопрос был как отказаться от статического указателя, но при этом чтобы указатели всех экземпляров этого класса ссылались на единсвенный экземпляр класса хранилище
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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;
};
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 20:05
Привет! Вот еще темы с ответами:

Создание экземпляр класса из другого класса - C++
Добрый день, форумчане. Помогите разобраться с такой плюсовенькой проблемой: есть 2 класса (назовем их A & B). Нужно в классе B запустить...

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - "указателЯ" Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

Создать экземпляр класса без явного указания членов класса - C++
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не могу создать экземпляр класса без явного...

Указатель на функцию-член одного класса в другом классе - C++ - C++
Добрый вечер! Может кто-то может помочь с проблемой. class Cook { public: void _cook_dish(Dish cook_dish_id) { ... ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.09.2013, 20:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru