Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将向量成员变量返回到外部类的最佳方法 我试图在C++中写一个LED条驱动器。现在我有一个Strip类和一个Driver类;条带类抽象出一个具有几个像素的LED条带,而驱动程序类将条带数据聚合到单个缓冲区中,以通过UDP连接发送_C++_Vector_Reference_Smart Pointers - Fatal编程技术网

将向量成员变量返回到外部类的最佳方法 我试图在C++中写一个LED条驱动器。现在我有一个Strip类和一个Driver类;条带类抽象出一个具有几个像素的LED条带,而驱动程序类将条带数据聚合到单个缓冲区中,以通过UDP连接发送

将向量成员变量返回到外部类的最佳方法 我试图在C++中写一个LED条驱动器。现在我有一个Strip类和一个Driver类;条带类抽象出一个具有几个像素的LED条带,而驱动程序类将条带数据聚合到单个缓冲区中,以通过UDP连接发送,c++,vector,reference,smart-pointers,C++,Vector,Reference,Smart Pointers,相关部分类别: class Strip { public: ... ??? getPixelData(); int getPixelDataLength(); protected: std::vector<unsigned char> mPixelData; class Driver { public: ... void aggregateStrips(); protected: vector<unsig

相关部分类别:

class Strip {
  public:
    ...
    ??? getPixelData();
    int getPixelDataLength();
  protected:
    std::vector<unsigned char> mPixelData;

class Driver {
  public:
    ...
    void aggregateStrips();
  protected:
    vector<unsigned char> mBuffer;
我的问题是--
getPixelData()
应该返回什么?它是否应该将智能指针(
shared_ptr
?)返回到向量?或者是推荐信?我只想要地址(和长度),因为我计划
memcpy
it


谢谢

通常,您会返回对向量的常量引用(
std::vector const&
),在这种情况下,您还应该使方法常量,因为它不会修改对象:

std::vector<unsigned char> const & getPixelData() const;
std::vector const&getPixelData()const;
来电者可以决定是否需要复印

// Causes copy-initialization.
std::vector<unsigned char> copy = a_strip.getPixelData();

// Binds a new reference to the existing vector; no copy is made.
std::vector<unsigned char> const & not_a_copy = a_strip.getPixelData();
//导致复制初始化。
std::vector copy=a_strip.getPixelData();
//将新引用绑定到现有向量;没有复制。
std::vector const¬_a_copy=a_strip.getPixelData();


getPixelDataLength()
也可能成为该类的常量成员。尝试使任何不更改对象常量成员的成员成为常量成员,因为这将允许在常量对象上调用它们。

std::vector
通过其
data()
方法公开其管理的缓冲区,在这种情况下,根据
Strip
/
mBuffer
是否为
const
返回
unsigned char*
。此方法是在C++11中添加的

作为旁注,将只读方法设置为
const
(在括号中的方法参数之后),这样就可以在类的
const
实例上调用它们,并且不允许修改任何成员变量,这是一种很好的设计

我将
getPixelData()
定义为:

const unsigned char* getPixelData() const
{
  return mBuffer.data();
}
std::size_t getPixelDataLength() const
{
  return mBuffer.size();
}
类似地,我将
getPixelDataLength()
写成:

const unsigned char* getPixelData() const
{
  return mBuffer.data();
}
std::size_t getPixelDataLength() const
{
  return mBuffer.size();
}
另一方面,for(auto strip:Strips)实际上复制了每个条带。如果您引用每个现有条带而不复制它,您的程序将更加高效:

for (const auto& strip : Strips) {
  // ...
}

不是返回向量,而是将一对(常量)迭代器返回到向量的开头和结尾:

using PixelIterator = std::vector<unsigned char>::const_iterator;
class Strip {
 ... 
 PixelIterator begin() const {
   return mPixelData.begin();
 }
 PixelIterator end() const {
   return mPixelData.end();
 }
};
如前所述,在基于范围的循环中使用
auto&
,以避免复制


您不需要维护单独的长度变量,因为您可以轻松获得
std::vector

的大小来实现
getPixelData()
,我是否只
返回mBuffer
?或
return&mBuffer
?@nathanlachenmyer
return-mBuffer
&
将获取地址,只有在需要指针时才需要该地址。(如果引用不是指针),如果你想在MeMCPY中使用返回值(坏主意混合C风格拷贝和C++对象),那么你必须这样做。const char*getPixelData(void){return mPixelData.data();}不过我更喜欢cdhowie关于接口外观的建议。@rakeshdn您根本不需要该接口,只需在调用站点执行
foo.getPixelData().data()
即可获得这样的指针。+1用于提倡
const
正确性。更多关于这方面的讨论可以在中找到。谢谢!我不知道我可以用auto来引用,这真的很聪明。我也很感激你能告诉我你是怎么做的,没问题。实际上,C++标准委员会目前正在考虑通过<代码> >(条形:条)<代码>,而不必指定<代码>自动>代码>,使<<代码> > <代码>循环变得更简单!