gpt4 book ai didi

c++ - 私有(private)类名缩写技巧?

转载 作者:太空狗 更新时间:2023-10-29 21:22:00 26 4
gpt4 key购买 nike

我的类(class)使用 PImpl 习语,看起来像这样:

// In LongDescriptiveClassName.hpp

class LongDescriptiveClassName
{
public:
// Stuff...

private:
struct LongDescriptiveClassNameData;

LongDescriptiveClassNameData &Data;
};

在 .cpp 文件中,我声明/定义了私有(private)结构:

// In LongDescriptiveClassName.cpp

struct LongDescriptiveClassName::LongDescriptiveClassNameData
{
void PrivateMethod1();
void PrivateMethod2();
// and so on...
};

void LongDescriptiveClassName::LongDescriptiveClassNameData::PrivateMethod1()
{
// Stuff...
}

void LongDescriptiveClassName::LongDescriptiveClassNameData::PrivateMethod2()
{
// Stuff...
}

这让我读起来很痛苦。 有没有一种方法可以缩写导致私有(private)方法的名称?

我的理解是我不能在 .cpp 文件中 typedef 它,因为 PImpl 结构是私有(private)的。使用 #define 会是一种邪恶吗?

#define ShortName LongDescriptiveClassName::LongDescriptiveClassNameData

struct ShortName
{
// ...
};

void ShortName::PrivateMethod1()
// ...

这个 .cpp 文件是唯一需要缩写的源文件,并且仅用于方法定义。你有什么建议?

最佳答案

类名已经是命名空间了,所以没有理由给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...
}

它工作得很好。

顺便说一句,您的代码不是 pimpl 习语的示例。 “pimpl”中的“p”表示“指针”,这一点很重要。引用意味着该对象不拥有其实现。

不一定是错的;有时有很好的理由将引用包装在类中,但这不是 pimpl 的习惯用法。

关于c++ - 私有(private)类名缩写技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21539531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com