No std::string
Custom exceptions (no explicit try...catch, I think only ints could be 'thrown')
2-phase construction for C-classes.
Explicit lifetime management (to be fair RAII wasn't a thing in 'normal' C++ at the time either)
Link by ordinal
One interesting thing was that there were mandated, and strictly enforced, naming conventions and coding style. For example, above I mentioned C-classes. You had to use these in certain circumstances by inheriting from a CBase class. This gave you a virtual destructor and zero-initialised the memory. R-classes were resources classes mainly for things that needed Open and Close functionality.
I joined straight out of university and probably learned more about softare development in my first 6 months at Symbian than in 4 years of uni. There were some incredibly clever people there.
RAII in C++ dates back to 1984-1989, and Strousop wrote about it in his 1994 book Design and Evolution of C++. And C++98 had auto_ptr<>. Symbian's release in 1997 means it had a weird timing relationship with C++ standardization, but RAII was still enough of a thing at the time to be in that very first standardized STL release.
Also, as example of complex apps, there is code of Lonely Cat Games' X-plore[1] & ProfiMail[2] apps, released to Public Domain by LCG devs in 2015-2016.
Another one Symbian open-source app that I like: `fshell` — Symbian equivalent of bash + telnet + a posix-like set of command-line tools.[3]
And the latest app in development: S60Maps — OpenStreetMap & GPS tracker.[4]
FTR, Actually there is an experimental Symbian OS emulator for Linux & Windows.[5]
P.S.: And off course there are tons of useful stuff collected by "Symbian Archive" wiki.[6,7]
[0] https://github.com/trufanov-nok/SymbianBook_ru
[1] https://github.com/Symbian9/X-plore_free
[2] https://github.com/Symbian9/ProfiMail_free
[3] https://sourceforge.net/p/fshell/code/
[4] https://github.com/artem78/s60-maps
[5] https://github.com/EKA2L1/EKA2L1
and I remember another pain point was feature detection, but can't recall the specifics.
It had MMP files which described the project and the files in it, a then a tool called 'abld' which was a perl script that did the compiling, which actually had two commands to clean... 'abld clean' and 'abld reallyclean' :)
Here is how it did its version of std::string:
http://n-gage.org/symbian-sdk-doc/6.1/developerlibrary/Commo...
It actually wasn't too bad once it was beaten into you by the compiler and code reviews. Non-embedded C++ devs can count their lucky stars.
Was this just a "using different elements of C++" kind of dialect, or was this an "early Win32 when you had to use pretend-C++ (ATL) together with your real C++, bridging the two with C" kind of dialect?
I feel like a lot of application frameworks developed in the 90s ended up in the latter style, as C++ was just becoming popular around then, and many frameworks chose to "merge into" C++ support from C support, rather than creating a ground-up C++ SDK.