Можем ли мы назвать имя класса так, как мы это делаем в пространствах имен?

Можем ли мы назвать имя класса так, как мы это делаем в пространствах имен?

Например:

namespace longname{ }
namespace ln = longname;// namespace aliasing

class LONGNAME {};
class LN = LONGNAME; // how to do class name aliasing, if allowed?

Ответ 1

Простой:

typedef LONGNAME LN;

Typedefs используются в С++ как "переменные, которые могут хранить типы". Пример:

class Car
{
public:
    typedef std::vector<Wheel> WheelCollection;

    WheelCollection wheels;
};

Используя Car::WheelCollection всюду, а не std::vector<Wheel>, вы можете изменить тип контейнера в одном месте и изменить весь код на изменения. Это метод С++ для абстрактного типа данных (тогда как, например, в С# у вас есть свойство, возвращающее IEnumerable<Wheel>).

Ответ 2

Вы можете использовать typedef ключевое слово:

typedef LONGNAME LN;

Вы также можете сделать что-то вроде:

typedef class {

...

} LN;

Edit: Однако при использовании шаблонов могут возникнуть проблемы. См. здесь для возможного решения.

Ответ 3

Помимо ответов, уже предоставленных с помощью ключевого слова typedef, вы также можете использовать ключевое слово using с С++ 11. IMHO выглядит более последовательным в отношении псевдонимов.

namespace longname{ }
namespace ln = longname;// namespace aliasing

class LONGNAME {};
using LN = LONGNAME; // "class aliasing"

Кроме того, с using вы можете использовать классы шаблонов alias (Как typedef класс шаблона?) с помощью шаблоны псевдонимов.

template<typename T> class LONGNAME {};
template<typename T> using LN = LONGNAME<T>; // alias template

Ответ 4

typedef int mark;  // for in built data types

class abc
{
};

typedef abc XYZ; // for user written classes.

Typedef позволяет вам присваивать имя класса или типа данных с более контекстно-зависимым именем, соответствующим сценарию.