@mzimmers said in Implementing many-to-many relationships:
Doesn't seem to me that I'd need new/delete anyway, but I do agree that it seems preferable to:
create and maintain a map of Equipment objects (or structs) with a UUID as the key
in the Activity object, maintain a list of Equipment UUIDs.
Is this what you had in mind?
The various comments here went towards using pointers to instances of classes as the relationship. Can't use a raw pointer (safely) without 'new'.
If your only objects are the Equipment and the Activity, then yeah, that's pretty simple.
as this got confusing, here is a very quick and dirty mockup I just wrote in 5 minutes. Apologies for the roughness.
struct PActivity;
struct PEquipment;
class ManagerPrivate
{
public:
std::map<int, PActivity> m_activities;
std::map<int, PEquipment> m_equipments;
int m_lastAssignedId = 0;
};
struct PActivity
{
QString name;
};
struct PEquipment
{
QString name;
std::deque<int> activities;
}:
class Manager
{
public:
ManagerPrivate *d;
Activity createActivity();
};
// ----
class Activity
{
public:
explicit Activity(Manager *parent, int n);
Activity(); // gives invalid instance.
bool isValid() const { return d && n; }
QString name() const {
assert(isValid());
auto i = d->m_activities.find(n);
assert(i != d->m_activities.end());
return i->name;
}
void setName(const QString &name) {
assert(isValid());
auto i = d->m_activities.find(n);
assert(i != d->m_activities.end());
i->name = name;
}
int id() const { return n; }
private:
ManagerPrivate *d = nullptr;
int n = 0;
};
class Equipment
{
explicit explicit(Manager *parent, int n);
explicit(); // gives invalid instance.
bool isValid() const;
QString name() const;
void setName(const QString &name);
void addActivity(const Activity &a) {
assert(a.isValid());
assert(isValid());
auto i = d->m_equipments.find(n);
assert(i != d->m_equipments.end());
i->activities.push_back(a->id());
}
private:
ManagerPrivate *d = nullptr;
int n = 0;
}