c++ - 保护私有(private)成员通过引用返回,避免意外重新分配

标签 c++ pointers reference constants

我有以下函数原型(prototype):

virtual CBuffer& GetData(unsigned int& samples, unsigned int& stride);

这将返回对 CBuffer 对象的引用,该对象是我的类的私有(private)成员。

问题是,如果编写以下内容,该方法返回的内部私有(private)成员将被重新分配。

CBuffer& CPlug::ProcessData(unsigned int& samples, unsigned int& stride)
{
  /* get the data from the source */
  CBuffer& buffer = m_source.GetData(samples, stride);

  if (m_postProcess)
    buffer = PostProcess(buffer, samples, stride);

  return buffer;
}

显然,可以通过执行以下操作来解决此问题:

CBuffer& CPlug::ProcessData(unsigned int& samples, unsigned int& stride)
{
  /* get the data from the source */
  CBuffer* buffer = &m_source.GetData(samples, stride);

  if (m_postProcess)
    buffer = &PostProcess(*buffer, samples, stride);

  return *buffer;
}

但是我想知道是否有某种方法可以防止这种情况发生,可能是通过使用我不知道的const

在这一点上,我认为我应该转换为使用指针,但很高兴知道是否可以做到。

最佳答案

因为样本包含一千多个单词,因此可能: see it live

#include <vector>
#include <memory>

typedef std::vector<int> CBuffer;

static CBuffer& PostProcess(CBuffer& data)  { 
    for(auto& el : data)
        el /= 2;
    return data;
}

struct CSource
{
    CSource() : _data(std::make_shared<CBuffer>(10)) {}

    std::shared_ptr<CBuffer>       GetData()       { return _data; }
    std::shared_ptr<const CBuffer> GetData() const { return _data; }

  private:
    std::shared_ptr<CBuffer> _data;
};

struct CPlug
{
    CPlug(bool postProcess = true) : m_postProcess(postProcess) { }

    std::shared_ptr<const CBuffer> ProcessData() const
    {
        /* get the data from the source, implicitely const */
        auto buffer = m_source.GetData();

        if (!m_postProcess)
            return buffer;

        // clone!
        auto clone = *buffer;
        return std::make_shared<CBuffer>(PostProcess(clone));
    }

  private:
    bool    m_postProcess;
    CSource m_source;
};

int main()
{
    CPlug intance;
}

关于c++ - 保护私有(private)成员通过引用返回,避免意外重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17854260/

相关文章:

c - 2维指针存储字符串

C - 我从同一个变量中得到两个不同的点

Android 字符串资源引用

c++ - 为什么非阻塞套接字在 connect() 或 accept() 之前是可写的?

c++ - 为什么 CFileDialog::GetNextPathName 在文件路径很长时不起作用?

c++ - int* 参数是否与 int[] 参数完全相同

c++ - 客户端服务器 API 交互

c - C 中的动态 3D 可变列字符数组操作

c++ - 关于将临时对象传递给 const 引用

c++ - 引用二维 vector 中的元素 (c++)