ICU 74.1 74.1
Data Structures | Namespaces | Macros | Typedefs
uobject.h File Reference

C++ API: Common ICU base class UObject. More...

#include "unicode/utypes.h"
#include "unicode/platform.h"

Go to the source code of this file.

Data Structures

class  icu::UMemory
 UMemory is the common ICU base class. More...
 
class  icu::UObject
 UObject is the common ICU "boilerplate" class. More...
 

Namespaces

namespace  icu
 File coll.h.
 

Macros

#define U_NO_THROW   noexcept
 Since ICU 64, use noexcept instead. More...
 
#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(myClass)
 This is a simple macro to add ICU RTTI to an ICU object implementation. More...
 
#define UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(myClass)
 This macro adds ICU RTTI to an ICU abstract class implementation. More...
 

Typedefs

typedef void * UClassID
 UClassID is used to identify classes without using the compiler's RTTI. More...
 

Detailed Description

C++ API: Common ICU base class UObject.

Definition in file uobject.h.

Macro Definition Documentation

◆ U_NO_THROW

#define U_NO_THROW   noexcept

Since ICU 64, use noexcept instead.

Previously, define this to define the throw() specification so certain functions do not throw any exceptions

UMemory operator new methods should have the throw() specification appended to them, so that the compiler adds the additional nullptr check before calling constructors. Without, if operator new returns nullptr the constructor is still called, and if the constructor references member data, (which it typically does), the result is a segmentation violation.

Stable:
ICU 4.2. Since ICU 64, Use noexcept instead. See ICU-20422.

Definition at line 49 of file uobject.h.

◆ UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION

#define UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION (   myClass)
Value:
UClassID U_EXPORT2 myClass::getStaticClassID() { \
static char classID = 0; \
return (UClassID)&classID; \
}
void * UClassID
UClassID is used to identify classes without using the compiler's RTTI.
Definition: uobject.h:96

This macro adds ICU RTTI to an ICU abstract class implementation.

This macro should be invoked in *.cpp files. The corresponding header should declare getStaticClassID.

Parameters
myClassThe name of the class that needs RTTI defined.
Internal:
Do not use. This API is for internal use only.

Definition at line 312 of file uobject.h.

◆ UOBJECT_DEFINE_RTTI_IMPLEMENTATION

#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION (   myClass)
Value:
UClassID U_EXPORT2 myClass::getStaticClassID() { \
static char classID = 0; \
return (UClassID)&classID; \
} \
UClassID myClass::getDynamicClassID() const \
{ return myClass::getStaticClassID(); }

This is a simple macro to add ICU RTTI to an ICU object implementation.

This does not go into the header. This should only be used in *.cpp files.

Parameters
myClassThe name of the class that needs RTTI defined.
Internal:
Do not use. This API is for internal use only.

Definition at line 295 of file uobject.h.

Typedef Documentation

◆ UClassID

typedef void* UClassID

UClassID is used to identify classes without using the compiler's RTTI.

This was used before C++ compilers consistently supported RTTI. ICU 4.6 requires compiler RTTI to be turned on.

Each class hierarchy which needs to implement polymorphic clone() or operator==() defines two methods, described in detail below. UClassID values can be compared using operator==(). Nothing else should be done with them.

In class hierarchies that implement "poor man's RTTI", each concrete subclass implements getDynamicClassID() in the same way:
class Derived {
public:
virtual UClassID getDynamicClassID() const
{ return Derived::getStaticClassID(); }
}

Each concrete class implements getStaticClassID() as well, which allows clients to test for a specific type.

class Derived {
public:
static UClassID U_EXPORT2 getStaticClassID();
private:
static char fgClassID;
}
// In Derived.cpp:
UClassID Derived::getStaticClassID()
{ return (UClassID)&Derived::fgClassID; }
char Derived::fgClassID = 0; // Value is irrelevant
Stable:
ICU 2.0

Definition at line 96 of file uobject.h.