Заблокирован
1

Передача свойства одного экземпляра класса другому экземпляру класса

27.10.2014, 21:42. Показов 5181. Ответов 33
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <tchar.h>
 
class A
{
public:
    A();
    int aVar;
};
 
class B : public A
{
public:
    B();    
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    A* aObj = new A;
    aObj->aVar = 777;
 
    B* bObj = new B;
 
    //Хочу связать базовый класс B с классом А, так
    //чтоб при
    aObj->aVar = 333;
    if (bObj->aVar == 333)
    {
        //это было правдой :-)
    }
    return 0;
}
Можно ли как - то создать экземпляр класса А, выставить его переменные, а потом создать экземпляр класса В, для которого базовым классом был бы уже проинициализированный класс А? Чтоб поменяв в экземпляре класса А переменную, она менялась бы так же и в экземпляре класса В?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2014, 21:42
Ответы с готовыми решениями:

Передача конструктору одного класса объект другого класса
Здравствуйте, кодеры. Столкнулся с проблемой. У меня есть 2 класса Camera и Game и...

Присваивание значений одного класса другому.
Скажите, могу ли я присвоить значения одного объекта класса другому объекту того же класса? class...

В чем заключается наследование одного класса другому?
Вообщем есть пара заданий теория ,можек кто-нибудь помочь и ответить на них 1. В чем заключается...

Полиморфизм, наследование и приведение экземпляров класса одного к другому
Есть некий класс со своими переменными,его экземпляр занимает какое-то количество памяти....

33
47 / 28 / 12
Регистрация: 23.01.2013
Сообщений: 125
27.10.2014, 21:55 2
На момент выполнения тела конструктора наследника, базовый класс уже создан
0
Заблокирован
27.10.2014, 21:57  [ТС] 3
Цитата Сообщение от greenlight Посмотреть сообщение
На момент выполнения тела конструктора наследника, базовый класс уже создан
значит нужно либо вклинить до этого момента или же как то подменить таблицу виртуальных символов объекта класса В, правда я не знаю как
0
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,249
27.10.2014, 21:58 4
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Можно ли как - то создать экземпляр класса А, выставить его переменные, а потом создать экземпляр класса В, для которого базовым классом был бы уже проинициализированный класс А? Чтоб поменяв в экземпляре класса А переменную, она менялась бы так же и в экземпляре класса В?
Нельзя.
Это можно проэмулировать через указатель на "базовый" экземпляр. Но это будет уже не наследование.
1
Заблокирован
27.10.2014, 22:00  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
Нельзя.
чёрт подери )))
Сейчас я сформулирую, что мне вообще нужно... момент
0
Модератор
Эксперт С++
12448 / 10012 / 6025
Регистрация: 18.12.2011
Сообщений: 26,801
27.10.2014, 22:00 6
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

А не сгодится переменная со свойством static ?
Такая переменная одна на все экземпляры класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class A
{
public:
    A();
    static int aVar;
};
int A::aVar=0;
 
class B : public A
{
public:
    B();    
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    A* aObj = new A;
    aObj->aVar = 777;
 
    B* bObj = new B;
 
    //Хочу связать базовый класс B с классом А, так
    //чтоб при
    aObj->aVar = 333;
    if (bObj->aVar == 333)
    {
        //это было правдой :-)
    }
    return 0;
}
1
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,249
27.10.2014, 22:02 7
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
значит нужно либо вклинить до этого момента или же как то подменить таблицу виртуальных символов объекта класса В, правда я не знаю как
Там нечего подменять - это разные объекты с разными адресами. Там нет какой-то магической скрытой ссылки, которую можно перенаправить на другое место.
1
47 / 28 / 12
Регистрация: 23.01.2013
Сообщений: 125
27.10.2014, 22:02 8
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
значит нужно либо вклинить до этого момента или же как то подменить таблицу виртуальных символов объекта класса В, правда я не знаю как
Нужно пересмотреть проектирование классов. Давайте реально мучающий вопрос/задачу, уже на основе их можно будет говорить, что и как лучше сделать.
1
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
27.10.2014, 22:08 9
Ну так просто не) Надо создать конструтор копирования для класса B, и при создание обьекта передать в конструктор обьект класса A, в конструкторе выбрать поля из А в класс B. Или же перегрузить оператор присваивания и тоже самое выполнить что и в конструкторе копирования. Но это будет 2 разных обьекта всёрогно, чтобы при изминения одного обьекте менялся и другой, то надо ещё доработать вот что:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class A 
{
  public:
    int* ptr;
 
  public:
      A(){}
        
    A(int n)
        {
      ptr = new int;
      *ptr = n;
    }
};
 
class B : public A
{
  public:
    B() : A(){}
    B(A const& obj) {
      ptr = obj.ptr;
    }
};
 
int main(int argc, char * argv[])
{
 
  A* a = new A(10);
  B* b = new B(*a);
 
  std::cout << *a->ptr << std::endl;
  *b->ptr = 20;
   std::cout << *a->ptr  << std::endl;
Ну как пример сойдёт. А полиморфизм это из друго оперы.
1
Заблокирован
27.10.2014, 22:09  [ТС] 10

Не по теме:

Пока я рисую в пейнте весёлую картинку для объяснения...


Цитата Сообщение от zss Посмотреть сообщение
А не сгодится переменная со свойством static ?
А как удалять тогда статик такой? Допустим мне нужен статик указатель на объект, как не его удалить корректно? Просто из любого экземпляра ? (это ж по сути глобальная переменная)
0
Модератор
Эксперт С++
12448 / 10012 / 6025
Регистрация: 18.12.2011
Сообщений: 26,801
27.10.2014, 22:12 11
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

А зачем его удалять? Пусть сидит до закрытия программы.
Если надо удалять память, адресуемую этим указателем,
то можно это делать откуда угодно.
Хоть из экземпляра, хоть по имени класса.
1
Заблокирован
27.10.2014, 22:13  [ТС] 12
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
Ну как пример сойдёт. А полиморфизм это из друго оперы.
а если я удалю объект класса А, как объект класса В узнает о том, что объект по тому указателю (что был в классе А - Int, который допустим удаляется деструкторе класса А) уже был удалён и не стоит по нему обращаться, дабы не поймать аксес виолейшен ?
1
Модератор
Эксперт по электронике
8734 / 6525 / 886
Регистрация: 14.02.2011
Сообщений: 22,839
27.10.2014, 22:17 13
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
(это ж по сути глобальная переменная)
по сути она и есть
даже в памяти рядом с глобальными лежит
просто с ограниченной видимостью

C++
1
2
3
4
5
void func()
{
 static int a;
 
}
a это глобальная переменная( сейчас меня начнут пинать) которая видна только из func
1
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
27.10.2014, 22:20 14
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
а если я удалю объект класса А, как объект класса В узнает о том, что объект по тому указателю (что был в классе А - Int, который допустим удаляется деструкторе класса А) уже был удалён и не стоит по нему обращаться, дабы не поймать аксес виолейшен ?
Переписать класс так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A 
{
  public:
    std::shared_ptr<int> ptr;
 
  public:
      A(){}
        
    A(int n)
    {
      ptr = std::make_shared<int>(n);
    }
};
Тогда ptr будет существовать пока существуют ссылки на обьект типа int. Ну это уже мы гребём все дальше и дальше.
1
Модератор
Эксперт по электронике
8734 / 6525 / 886
Регистрация: 14.02.2011
Сообщений: 22,839
27.10.2014, 22:21 15
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
а если я удалю объект класса А, как объект класса В узнает о том, что объект по тому указателю
объект класса A это один объект
объект класса В это другой, в котором лежит объект класса А, так скажем подобъект
и объект класса A ничего не знает про объект класса A который лежит в объекте класса В

вот как они могут лежать в памяти
A

BA
1
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
27.10.2014, 22:21 16
/miss
1
Модератор
Эксперт по электронике
8734 / 6525 / 886
Регистрация: 14.02.2011
Сообщений: 22,839
27.10.2014, 22:22 17
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
а если я удалю объект класса А, как объект класса В узнает
есть такое волшебное слово, "виртуальный деструктор"
0
Заблокирован
27.10.2014, 22:24  [ТС] 18
Цитата Сообщение от ValeryS Посмотреть сообщение
по сути она и есть
даже в памяти рядом с глобальными лежит
просто с ограниченной видимостью
То есть допустим, у меня есть класс А со статической переменной и есть класс В с другой статической переменной, тогда:
1. Из объекта класса А я ни при каких обстоятельствах не смогу нагадить в статическую переменную объектов класса В?
2. Статическая переменная класса В будет едина и доступна во всех объектах класс В, а так же в его наследниках, но никак не в родителях, верно же? То есть это как бы глобальная переменная с иерархией наследования?
0
Модератор
Эксперт по электронике
8734 / 6525 / 886
Регистрация: 14.02.2011
Сообщений: 22,839
27.10.2014, 22:29 19
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
То есть допустим, у меня есть класс А со статической переменной и есть класс В с другой статической переменной,
в результате в классе В будет видна и одна и другая, если конечно не защитишь
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
1. Из объекта класса А я ни при каких обстоятельствах не смогу нагадить в статическую переменную объектов класса В?
нет
но наоборот сможешь, если конечно не защитишь
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
2. Статическая переменная класса В будет едина и доступна во всех объектах класс В, а так же в его наследниках, но никак не в родителях, верно же? То есть это как бы глобальная переменная с иерархией наследования?
эка ты загнул
я честно говоря не понял
0
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
27.10.2014, 22:32 20
Цитата Сообщение от ValeryS Посмотреть сообщение
я честно говоря не понял
Ну он имел ввиду что это как бы глобальная переменная для всех классов которые будут наследоваться от родителя этой статической переменной.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2014, 22:32
Помогаю со студенческими работами здесь

Как передать параметры конструктора одного класса другому?
Скажите пожалуйста, как это должно работать? Как передать параметры конструктора одного класса...

Наследование: как передать массив одного класса другому классу?
Доброе время суток, нужна помощь. Не могу сотворить чудо. Сомневаюсь уже во всём. Как передать...

Удаление экземпляра класса в функции самого класса (Ошибка при отладке)
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и...

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких...


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

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

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