Ну, я опоздал, я знаю, все же я хочу указать на другую возможность, если вы хотите полностью скрыть внутренности класса B:
class A
{
private:
class B;
std::set<B*> b_set;
};
Обратите внимание на использование указателей в наборе. Однако остается важное отличие: поскольку вставляются только указатели, вы все равно можете вставлять указатели на разные экземпляры с одинаковым содержимым. Чтобы решить эту проблему, вам нужен собственный компаратор:
class A
{
private:
class B;
struct Less
{
bool operator() (B const* x, B const* y) const
{
return *x < *y;
}
};
std::set<B*, Less> b_set;
};
Имейте в виду (это не упоминалось в предыдущем ответе, но там тоже требуется!), что должен быть определен компаратор для B (B или ссылка на, не указатель!):
A.h
#include <set>
class A
{
private:
class B;
struct Less
{
bool operator() (B const* x, B const* y) const;
};
std::set<B*, Less> b_set;
};
A.cpp
class A::B
{
friend bool Less::operator() (B const* x, B const* y) const;
bool operator<(B const& other) const
{
return foo < other.foo;
}
int foo;
};
bool A::Less::operator() (B const* x, B const* y) const
{
return *x < *y;
}
Это позволяет полностью скрыть B из заголовка, если вы хотите или должны по какой-либо причине. Однако вы больше не можете вставлять объекты из стека напрямую, так как они не копируются, и у вас есть указатели на стек, которые быстро становятся недействительными. Особое внимание следует уделить удалению объектов, когда они больше не нужны, иначе возникнут утечки памяти. Помните, что в Java нет сборки мусора. Если вы используете С++ 11, вы можете решить проблему, используя ::std::unique_ptr, до, ::std::auto_ptr:
A.h
#include <set>
#include <memory>
class A
{
private:
class B;
struct Less
{
bool operator() (B const* x, B const* y) const;
};
std::set<std::unique_ptr<B>, Less> b_set;
};
person
Aconcagua
schedule
09.10.2015