Как поместить «нетривиальный» объект в стуктуру? Доброе время суток!
Я не знаю как правильно сформулировать мой вопрос, так как столкнулся с этим впервые, обшарил кучу форумов, но толком так и не понял в чем суть.
У меня есть следующая структура проекта. (В урезаном формате и без реализации методов, вставлю только имеющиеся конструкторы)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
211 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир