C++ 私有类名缩写技术?
我的类使用PImpl习惯用法,如下所示:C++ 私有类名缩写技术?,c++,class,typedef,private,c-preprocessor,C++,Class,Typedef,Private,C Preprocessor,我的类使用PImpl习惯用法,如下所示: // In LongDescriptiveClassName.hpp class LongDescriptiveClassName { public: // Stuff... private: struct LongDescriptiveClassNameData; LongDescriptiveClassNameData &Data; }; 在.cpp文件中,我声明/定义私有结构: // In LongDescr
// In LongDescriptiveClassName.hpp
class LongDescriptiveClassName
{
public:
// Stuff...
private:
struct LongDescriptiveClassNameData;
LongDescriptiveClassNameData &Data;
};
在.cpp文件中,我声明/定义私有结构:
// In LongDescriptiveClassName.cpp
struct LongDescriptiveClassName::LongDescriptiveClassNameData
{
void PrivateMethod1();
void PrivateMethod2();
// and so on...
};
void LongDescriptiveClassName::LongDescriptiveClassNameData::PrivateMethod1()
{
// Stuff...
}
void LongDescriptiveClassName::LongDescriptiveClassNameData::PrivateMethod2()
{
// Stuff...
}
这对我来说读起来很痛苦有没有一种方法可以将私有方法前面的名称缩写出来?
我的理解是,我不能在.cpp文件中typedef
它,因为PImpl结构是私有的。使用#define
会是一种罪恶吗
#define ShortName LongDescriptiveClassName::LongDescriptiveClassNameData
struct ShortName
{
// ...
};
void ShortName::PrivateMethod1()
// ...
这个.cpp文件是唯一需要对其进行缩写的源文件,并且仅用于方法定义。你有什么建议?我不能完全理解你的问题,但似乎正确使用
和关键字应该会有很大帮助。不是吗
using ShortName = LongDescriptiveClassName::LongDescriptiveClassNameData
你在找什么
请注意,唯一的工作是LongDescriptiveClassNameData
是一种类型而不是数据。类名已经是一个命名空间,因此没有理由给impl这么长的名称:
class LongDescriptiveClassName
{
public:
// Stuff...
private:
struct Impl;
// shared_ptr is also an option if that's
// the semantics you want.
std::unique_ptr<Impl> Data;
};
// and off in the implementation, we have...
struct LongDescriptiveClassName::Impl
{
void PrivateMethod1();
void PrivateMethod2();
// and so on...
};
void LongDescriptiveClassName::Impl::PrivateMethod1()
{
// Stuff...
}
class LongDescriptiveClassName
{
公众:
//东西。。。
私人:
结构Impl;
//如果需要,共享的ptr也是一个选项
//你想要的语义。
std::唯一的ptr数据;
};
//在实施过程中,我们。。。
结构LongDescriptiveClassName::Impl
{
void PrivateMethod1();
void PrivateMethod2();
//等等。。。
};
void LongDescriptiveClassName::Impl::PrivateMethod1()
{
//东西。。。
}
它很好用
顺便说一句,您的代码不是pimpl习惯用法的示例。“pimpl”中的“p”表示“指针”,这一点很重要。引用意味着对象不拥有其实现
这不一定是错的;有时有很好的理由将引用封装在类中,但这不是pimpl的惯用用法。虽然@pseuronym的解决方案非常好,但我更喜欢仅对类型使用带有大写字母的名称,因此我认为我应该:
class LongDescriptiveClassName {
private:
struct Data;
Data &data;
};
我喜欢称它为Impl
,或Detail
(尽管后者作为名称空间细节也很常见)。而不是使用LongDescriptiveClassNameData
使用ShortNameData
。短得多。如果您担心冲突,为什么不使用名称空间?她说您为什么不能这样做:LongDescriptiveClassNameData
是私有的。这是一个很好的观点,我想实现不需要这么长的名称。但是,如果我确实想进一步缩短名称以仅在这个.cpp文件中使用,那么使用#define
指令有什么害处?哦,我以为“p”代表“私人”。感谢您提供的信息。在这种情况下不使用#define
的唯一原因是,如果可能且合理的话,总是要避免使用C风格的宏。宏颠覆了C++类型的系统,C++类型的系统通常是你的朋友。我通常不把我的意思叫做“数据”,因为我经常把成员函数也放在那里。你想要隐藏的往往不仅仅是私人数据,还有私人行为。当然,你的里程数可能会有所不同。我只是重复使用原来的名字。我只考虑适合于表示一组属性的数据,比如说,持久状态或类似的东西。