У меня есть два указателя указателей на классы A
и B
и пытаюсь сделать метод, который удаляет объект из этих векторов. Этот объект может быть или не быть подклассом A
и/или B
и не должен быть элементом любого из векторов. Я попытался следующий код:C++ сравнения указателей с использованием множественного наследства с неизвестным базовым классом
void removeObject(void *object) {
A *pa = static_cast<A*>(object);
std::vector<A*>::iterator aPos = std::find(as.begin(), as.end(), pa);
if (aPos != as.end())
as.erase(aPos);
B *pb = static_cast<B*>(object);
std::vector<B*>::iterator bPos = std::find(bs.begin(), bs.end(), pb);
if (bPos != bs.end())
bs.erase(bPos);
}
но указатели имеют различные значения, так std::find
не работает (или, скорее, он работает иногда). После прочтения Multiple inheritance pointer comparison и C++ pointer multi-inheritance fun Я понимаю, почему, но в обоих случаях предлагаемым решением было указать указатель на *subclass
. Мои вопросы:
- Как проверить, ссылаются ли два указателя на один и тот же объект , не зная его типа?
- Есть ли более элегантное решение моей проблемы?
Я новичок в C++ поэтому, пожалуйста, простите меня, если я полностью понял что-то ...
Я не верю, что на самом языке есть решение. Ваше решение, вероятно, будет включать соглашение ... например, все объекты, которые вы собираетесь сравнить таким образом, наследуют от класса (интерфейса), который предоставляет единственную виртуальную функцию, которая возвращает void *, которая реализуется посредством 'return static_cast (this) ', а затем вы сравниваете указатели, которые вы возвращаете с этого вызова. Если вы программист Windows - это похоже на то, как вы всегда сравниваете два COM-объекта, сначала создавая QueryInterface для IUnknown, а затем сравнивая эти два указателя IUnknown. –
davidbak
Пожалуйста, объясните свою иерархию классов. Кажется, что и A, и B необходимо связать через некоторый общий базовый класс, который будет иметь информацию типа в форме, например. ENUM. В этом случае вы можете применить void * к этому базовому классу и найти базовый тип, прочитав перечисление, которое должно было быть установлено при создании экземпляра класса.Может быть какое-то другое сложное решение, но я не могу придумать его, особенно с множественным наследованием, он становится более сложным – Arunmu