Vinokanth Velu Ответов: 2

Можно ли создать экземпляр объекта в куче по следующей причине?


У меня есть класс, и конструктор принимает параметр. Например,
class Entity
{
private:
    int number_;
public:
    Entity(int number):number_(number)
    {
       std::cout << "Entity object created";
    }
}

// header
class SuperEntity
{
private:
   Entity *entity_;

public:
   SuperEntity(int value);
};

// source
SuperEntity::SuperEntity(int value)
{
    entity_ = new Entity(value);
}


класс SuperEntity имеется собственный член Entity. Так как для того, чтобы создать экземпляр Entity вам нужно пройти в Ан int конструктору и не может быть сделано объявление файла, потому что int value необходимо создать экземпляр Entity пока недоступно, можно ли динамически выделять Entity в SuperEntity's конструктор? Разве это плохая практика? Спасибо.


Что я уже пробовал:

Именно так я поступаю в проекте, когда для создания экземпляра объекта требуются параметры инициализации.

Usman Hunjra

Я думаю, что вы хотите реализовать ассоциацию .
Я прав. ?

Usman Hunjra

Пожалуйста, уточните свой проект, что на самом деле вы хотите сделать ..
Это похоже на задание.
Каково ваше проектное заявление ???
Ну в соответствии с информацией которую вы разместили и кодом:

В классе SuperEntity есть указатель на класс Entity, поэтому в конструкторе вы должны написать это->entity_.setVal(6); Напишите сеттеры и геттеры и используйте их в конструкторе вместо использования списка инициализаторов членов.
Пожалуйста, подробно опишите проблему, связанную с вашим проектом ..

Кроме того, имейте в виду, что проект code - это потрясающая сеть для обучения путем обсуждения.
Ни одно тело не дает вам точного решения вашего задания..

Vinokanth Velu

Я знаю о сеттерах и геттерах. Мой вопрос заключается в том, как вы объявляете объекты в заголовочном файле, если конструктор класса принимает параметры?

Usman Hunjra

да, это плохая идея. Вы должны использовать списки инициализации членов и вызвать конструктор класса объекта, потому что класс SuperEntity имеет указатель на объект класса сущности.
Читайте о классах и конструкторах, как всегда медленно и уверенно выигрывает гонку..
Ваши основные понятия очень просты, работайте над ними до того, как приступите к реализации отношений..

Vinokanth Velu

Да, список инициализаторов членов-это ответ. Большое спасибо, приятель. Как вы сказали, мой фундамент очень слаб. Пытаюсь исправиться.

Usman Hunjra

Ты Более Чем Желанный Брат..

2 Ответов

Рейтинг:
0

PrafullaVedante

Вы можете использовать список инициализации. Вам не нужно создавать его в куче.

// source
SuperEntity::SuperEntity(int value):entity_(value)
{
    
}

Провозглашение Сверхсущности станет,
// header
class SuperEntity
{
private:
   Entity entity_;

public:
   SuperEntity(int value);
};


Рейтинг:
0

KarstenK

Это нормально, но рассмотрим лучший дизайн класса, например, как сделать SuperEntity дочерним классом из Entity. Почему это член клуба? Неужели это правда вынужден быть член клуба? Сохранение int - это не так уж много.

Вам также необходимо удалить сущность в коде деструктора SuperEntity.

Другое решение заключается в следующем:

// transfer of ownership!!!
SuperEntity::SuperEntity(Entity *pointer)
{
  entity_ = pointer;
};