I have been examining your code and here are a few points:
- functions should only be virtual if they are supposed to be overridden by derived classes. Do not make all functions virtual.
- asserts are heavily used, instead of real error handling. I'd prefer throwing exceptions when necessary and avoiding runtime logic errors whenever possible (by the use of RAII).
- RAII is not used. See
http://www.hackcraft.net/raii/ - it's a technique that should be heavily used in all C++ software because it makes the programs much safer (especially in terms of resource leaks) and reduces the need to check for errors everywhere.
- The naming convention (UpperCamelCaseFunctions, etc) is quite strange, but I suppose that you got it from wxWidgets.
- Functors don't need to be classes. Regular functions do just fine (for example, instead of class UserListCompare and its operator(), you could just have a function. Or in fact, since you are using std::strings in ascending order, don't use a custom comparator at all - std::map sorts correctly without one.
- using or using namespace must not be used in headers' file scope, because it will then propagate to the code that uses the header.
- using namespace std is in fact quite dangerous anyway, as it brings to your programs far more symbols than you can think of (some examples include std::min and std::count). Use it with great care.
- do not pass const std::string as function arguments, as it makes little sense (the argument is a local variable, a copy of the original, thus changes to it do not appear to the caller in any case). Instead, pass std::string or std::string const& (a reference to a const string). The latter avoids making a copy, the first makes one, and there shouldn't be much performance difference either way (std::strings are likely to be copy-on-write optimized).
- it is probably a good idea to divide the project in separate modules, each in their own namespace. One module for networking (potentially reusable for other lobbies), other for GUI.
- no license text is not needed in every file and one can instead state this and the developers in the documentation, reducing code clutter (note: the lack of license text == ├é┬® all rights reserved, so Microsoft cannot steal your code even though you don't have the license text in the same file).
- absolute paths aren't very nice is #include "/home/tc/Projects/springlobby/trunk/src/channellist.h"
- trivial functions should be implemented in headers (inside class {}), to reduce useless code and to allow the compiler to inline them.
I'll keep digging and I'll expect to be working on it during this weekend, once I get a hold of it.