【问题标题】:Correctly passing a vector by reference or pointer通过引用或指针正确传递向量
【发布时间】:2014-02-04 00:50:00
【问题描述】:

我尝试(基本上)为 std::vector (它的 D3D10 渲染)创建一个 Setter 方法

void GraphicsClass::BeginFrame(vector<LightClass> const &vlights)
{
    lights = vlights;

其中lights是GraphicsClass的私有成员,声明:

vector<LightClass> lights;

现在,数组的属性被复制;但元素lights[0], lights[1] 等包含垃圾。我使用 Visual Studio 调试器检查了这一点。

我显然可以通过使用来解决

void GraphicsClass::BeginFrame(vector<LightClass> const &vlights) {
    int size = vlights.size();
    int i;
    lights.resize(size);
    for (i = 0; i < size; i++)
       lights[i] = vlights[i];

但我不喜欢我不明白这个话题,而且这段代码似乎慢了一点。

提前感谢您的回答!

LightClass 按要求:

class LightClass
{
public:
LightClass(void);
~LightClass(void);
void SetDiffuseColor(float, float, float, float);
void SetDirection(float, float, float);

D3DXVECTOR4 GetDiffuseColor();
D3DXVECTOR3 GetDirection();

 private:
D3DXVECTOR4 m_diffuseColor;
D3DXVECTOR3 m_direction;
};

构造函数和析构函数都是空的,这是一个错误(我从只创建指针的类中复制了它。比如 Type *thing。我是 OOP 的新手)

我可能会将矢量更改为矢量。

【问题讨论】:

  • 另外,VS 调试器可能不会向您显示正确的信息,尤其是在您调试优化的构建时。

标签: c++ pass-by-reference pass-by-pointer


【解决方案1】:

您需要为LightClass 实现复制构造函数,而不仅仅是operator=(如您的解决方法)。

【讨论】:

  • 这到底是什么意思?我知道复制构造函数是 void LightClass(const LightClass&) { something} 我必须在那里做什么?为什么这是必要的?
  • 你说复制整个数组后你得到了垃圾。这是因为 vector 上的复制和赋值都会调用所包含元素的复制构造函数。如果您的复制构造函数为空,则元素将在初始化之前包含垃圾。编译器不会自动知道如何复制类成员,即使它看起来很简单。
  • 澄清一下,只要你声明一个拷贝构造函数,你就会得到一个默认的成员拷贝,但这可能会也可能不会起作用,具体取决于成员类型和您的意图。你最好明确定义一个。
  • 好的,所以我必须实现一个复制构造函数,其中填充了有意义的代码。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2014-07-27
相关资源
最近更新 更多