Как поместить «нетривиальный» объект в стуктуру? Доброе время суток!
Я не знаю как правильно сформулировать мой вопрос, так как столкнулся с этим впервые, обшарил кучу форумов, но толком так и не понял в чем суть.
У меня есть следующая структура проекта. (В урезаном формате и без реализации методов, вставлю только имеющиеся конструкторы)class Point : public PointBase
{
public:
Point(double X, double Y, double Z)
{
}
private:
double X;
double Y;
double Z;
};
class Edge : public EdgeBase
{
public:
Edge(Point* firstPoint, Point* secondPoint)
{
this->firstPoint = firstPoint;
this->secondPoint = secondPoint;
}
private:
Point* firstPoint;
Point* secondPoint;
};
template
struct item
{
item* next;
type_t data;
};
template
class Array : public ArrayBase
{
public:
Array();
friend class IArray;
private:
item *head;
item *tail;
};
template class Array;
template
class IArray
{
public:
IArray() {};
IArray(Array&);
private:
Array* arr;
item* currentItem;
};
class Model : public ModelBase
{
public:
Model();
Model(const Model& model)
{
};
Model& operator=(const Model& model)
{
}
private:
IArray points;
IArray edges;
Model(Model&&);
};
Далее, например в классе IArray (итератор для класса Array), я хочу сделать функцию добавления элемента.
Но на попытку выделить памятьitem* newItem = new item;
выскакивает ошибка C2280 "item::item(void)": attempting to reference a deleted function мол попытка ссылки на удаленную функцию, в качестве функции он требует конструктор у структуры item (?_?)
При добавлении всевозможных конструкторов (вообще впервые на самом деле сталкиваюсь, чтобы структура требовала конструкторы, учитывая, что уже делал подобный проект)
(ограничился этими, не знаю, что еще можно добавить)template
struct item
{
item* next;
type_t data;
item() {};
item(const item&) {};
item(item&&) {};
};
Выскакивает ошибка, что не найден конструктор подходящий конструктор по умолчанию для Edge (для Point типа найден ~_~)
В чем собственно тут дело я без понятия, предположение только в том, что в Edge по сути у нас хранится еще один объект (правда там только указатель на него), хотя не знаю как это может влиять.
Буду очень признателен, если кто-то поможет разобраться в этой ситуации, и подсказать возможное ее решение. Заранее спасибо!

21 Авг 2019 в 07:04
170 +1
0
Ответы
1

Проблема здесь действительно связана с тем, что структура item требует наличия конструктора по умолчанию для типа type_t, который в данном случае используется как Point и Edge.
Чтобы исправить эту проблему, вам нужно убедиться, что тип type_t (то есть Point и Edge в вашем случае) имеет конструктор по умолчанию или явно определенный конструктор, который будет использоваться при создании объекта в структуре item.

Например, если у вас есть конструктор в классе Point и Edge, который принимает аргументы, вам нужно добавить конструктор по умолчанию в эти классы либо явно определить конструктор по умолчанию в структуре item для типа type_t.

Вот пример того, как можно обновить структуру item для работы с классами Point и Edge:// для Point
template struct item
{
item* next;
type_t data;

item() : next(nullptr), data() {}

};

// для Edge
template struct item
{
item* next;
type_t data;

item() : next(nullptr), data(nullptr, nullptr) {} // я предполагаю, что у Edge есть конструктор, который принимает указатели

};

Таким образом, по добавлению элемента у вас не будет ошибки, и объекты Point и Edge будут корректно инициализироваться в структуре item.

Надеюсь, что это поможет вам разобраться в проблеме и решить ее. Если у вас останутся вопросы, не стесняйтесь задавать их.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 541 автору
Первые отклики появятся уже в течение 10 минут
Прямой эфир