C++ 类成员始终作为一致性的指针?

C++ 类成员始终作为一致性的指针?,c++,C++,以这个类为例 #pragma once #include <memory> #include <string> class A; class B; class Test { public: Test(); ~Test(); private: std::unique_ptr<A> m_a; std::unique_ptr<B> m_b; std::unique_ptr<std::string>

以这个类为例

#pragma once

#include <memory>
#include <string>

class A;
class B;

class Test
{
public:
    Test();
    ~Test();

private:
    std::unique_ptr<A> m_a;
    std::unique_ptr<B> m_b;
    std::unique_ptr<std::string> m_string1; // 1
    std::string m_string2; // 2
};
#pragma一次
#包括
#包括
甲级;
乙级;;
课堂测试
{
公众:
Test();
~Test();
私人:
std::唯一的ptr m_a;
std::唯一的ptr m_b;
std::unique_ptr m_string1;//1
std::string m_string2;//2
};

我总是尝试在头文件中转发声明类。然而,对于标准头,我不会这样做,向前声明模板类的typedef只是一件痛苦的事情。无论如何,如果我有可用的标题-我应该选择第一种方式还是第二种方式-
m_string1
还是
m_string2
?我觉得如果我混合使用指针和值类型,那么它看起来不一致。将所有内容都设置为指针是一个好主意吗?

std::string
已经拥有一个动态结构(因此它本身就是指针)

毕竟,如果你认为一个字符串是“不透明类型”,那么不透明的,你甚至不想包括它的头,同样应该也为UnQuyjpTR…但您迟早必须停止,否则您将得到一类普通指针,并重新定义了big-5(ctor、dtor、copy、assign、move、transfer)。但这是每次都在重新实现智能指针

还要考虑将一个类分解为太小的动态“细节”会将对象分散在内存上,从而禁止(或使之更困难)任何基于系统缓存的处理器优化

如果您有一些模板,pimpl习惯用法甚至变得毫无用处:您必须将整个类作为头公开


在我看来,您对这个习惯用法的应用太深入了。

您希望它被分配到堆上还是潜在地分配到堆栈上?使用每种方法都有理由(例如对象生命周期),根据情况选择适当的方法。我觉得如果你不需要的话,做指针管理是没有意义的;即使您正在使用智能指针

另外,像
std::string
这样的类在内部通常是指向堆分配字符串的指针。因此,在本例中,您将为单个指针进行堆分配。堆分配比堆栈分配更昂贵,而且许多非常小的分配往往会快速分割堆空间,使分配器更难(也称为更慢)找到大小合理的连续可用空间块


在我看来,一致性一般来说是好的,但为了一致性而一致性是僵硬和不现实的。

如果要这样做,请使用
pImpl

class TestImpl;
class Test
{
public:
  Test();
  ~Test();

private:
  std::unique_ptr<TestImpl> m_;
};
类测试mpl;
课堂测试
{
公众:
Test();
~Test();
私人:
std::唯一的ptr m;
};
在.cpp文件中,创建一个
TestImpl
,其中包含所有数据


这将更好地隐藏您的实现细节,并减少间接性,因为
Test
的所有数据现在都是一致的(聚集的),如果仍然删除了间接寻址的一个步骤。

这个问题属于。我认为使用指向每个成员的指针可能会导致额外的空间-指针在32位系统中占用4字节,在64位系统中占用8字节。简单的数据类型最好以值的形式存储。@cppcoder:可能是对齐使短类型存储在相同的长空间中。。。很难说这是真的。