Попытайтесь выяснить, кто не терпит тупого поэлементного копирования, и изолировать их. Либо в один маленький объектик, либо в один маленький уровень наследования.
Вариант 1. Сделать промежуточный уровень наследования, в который вносим некопируемые части.
class LevelObject
{
private:
Level& level; // Сцылка на уровень, по определению неизменная
int x, y; // Присваивать.
}
Разбиваем на две части (внимание! — конструктор копирования для простоты не прописан, вероятно, потребуется и он):
#include <iostream>
class Level
{
public:
int value;
Level(int aValue) : value(aValue) {}
};
class LevelChild
{
protected:
Level& level; // не присваивать
public:
LevelChild(Level& aLevel) : level(aLevel) {}
LevelChild operator=(LevelChild&) { return *this; } // ничего не делающая операция «присвоить»
};
class LevelObject: public LevelChild
{
protected:
int x, y;
public:
LevelObject(Level& aLevel, int aX, int aY) : LevelChild(aLevel), x(aX), y(aY) {}
void print();
};
void LevelObject::print()
{
std::cout << "(" << x << ", " << y << ") at level " << level.value << std::endl;
}
int main()
{
Level l1(1); LevelObject o1(l1, 1, 2);
Level l2(2); LevelObject o2(l2, 3, 4);
o1.print();
o2.print();
o2 = o1;
o2.print();
}
Вариант 2. Сделать маленькие объекты-функции со своими операциями присваивания.
class LevelObject
{
private:
Level* level; // На сей раз уже копируется
Array3 pos; // Какой-то инкапсулированный объект-массив
std::wstring name; // тоже инкапсулированный объект
}
И всё, когда для std::wstring и Array3 корректно прописаны операции присваивания, для LevelObject всё будет работать корректно без единой строчки.
P. S. А точно ваш объект страдает от поэлементного копирования и нужна своя операция?