#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <utility>
 
using namespace std;
 
#define NONCOPYABLE(clazz_) \
  clazz_(clazz_ const&) = delete; \
  clazz_& operator=(clazz_ const&) = delete
 
struct Person
{
  string name;
  vector<Person*> freunde;
};
 
struct Welt
{
  list<Person> bewohner;
 
  Welt(){}
  NONCOPYABLE(Welt);
 
  Person* neuer_bewohner(string name);
};
 
Person* Welt::neuer_bewohner(string name)
{
  bewohner.emplace_back();
  Person* r = &bewohner.back();
  r->name = std::move(name);
  return r;
}
 
void befreunde(Person* wen, Person* mit)
{
  // TODO: ueberlegen, ob und wie man abfangen soll,
  // falls die zwei personen schon befreundet sind
  // oder ob wen==mit gilt.
  wen->freunde.push_back(mit);
  mit->freunde.push_back(wen);
}
 
int main()
{
  Welt w;
  Person* hans   = w.neuer_bewohner("Hans Wurst");
  Person* daniel = w.neuer_bewohner("Daniel Kaese");
  befreunde(hans,daniel);
}
