【问题标题】:C++ constructor call from another constructor with array initialisation从另一个具有数组初始化的构造函数调用 C++ 构造函数
【发布时间】:2014-06-16 13:00:54
【问题描述】:

我正在使用 OpenGL 编写一个新类,我的构造函数有两种可能性:

VertexObject();
VertexObject(GLuint* vertices,GLuint* elements);

我想做的是 VertexObject() 用一个已经初始化的数组调用另一个,例如

    VertexObject::VertexObject() : 
    VertexObject( 
    (GLuint[]) {
        0, 1, 2,
        2, 3, 0
    },
    (GLuint[]) {
        0, 1, 2,
        2, 3, 0
    }) {}

但似乎 C++ 不允许我这样做,错误是“获取临时数组的地址”。 我什至不确定我所要求的是否可行,但我们将不胜感激。

【问题讨论】:

  • 不应该verticeselements 是指向-const 的指针吗?
  • @Simple 因为非常数,我认为解决方案有点复杂——看我的回答

标签: c++ arrays constructor


【解决方案1】:

我建议你看看 boost 库,特别是 assign 模式(促进容器的初始化)可能会有所帮助。

这是一个小代码sn-p,可能会让您掌握想法:

VertexObjectc(boost::assign::list_of(0)(1)(2)(2)(3)(0).convert_to_container<GLuint>() );

我还没有测试过。

【讨论】:

  • 另一个答案解决了我的问题,但 boost 库实际上触发了另一个错误:无法从 int 转换为其他类型。我真的没有时间完全理解它,但现在我知道 Boos 似乎是一个不错的库。非常感谢您的帮助。
  • @user3714670 欢迎您。 Boost 值得研究(至少部分),它提供了很多很棒的功能。
【解决方案2】:

如果您在构造函数中对数组进行深度复制,或者如果数组从未被修改过并且VertexObject 不获取指针的所有权,则应该可以:

GLuint def_vert[6] = { // static storage
    0, 1, 2,
    2, 3, 0
};
VertexObject::VertexObject() : 
VertexObject(def_vert, def_vert) {}

当然,如果您希望每个参数有不同的值,您可以使用单独的数组。

【讨论】:

  • 嗯,我不知道为什么我没想到,我已经将它用于 default_shaders,非常感谢它解决了它^^
  • 可能是错误的——构造函数的参数不是const GLuint *,而是GLuint *,所以def_vert可以改。看我的回答。
  • @ikh: 是的,如果构造函数不修改数组,那么为了常量正确性,参数应该声明为const。在这种情况下,def_vert 也可以是 const
【解决方案3】:

试试这个:

// VertexObject.h
class VertexObject
{
private:
    static const GLuint m_default_vertices[6], m_default_elements[6];
    static GLuint *GetDefVertices();
    static GLuint *GetDefElements();
public:
    VertexObject() : VertexObject(GetDefVertices(), GetDefElements()) { }
    ...
};
// VertexObject.cpp
const GLuint VertexObject::m_default_vertices[6] = {
    0, 1, 2,
    2, 3, 0
};
const GLuint VertexObject::m_default_elements[6] = {
    0, 1, 2,
    2, 3, 0
};
GLuint *VertexObject::GetDefVertices()
{
    static thread_local GLuint ar[6];
    memcpy(ar, m_default_vertices, sizeof(ar));
    return ar;
}
GLuint *VertexObject::GetDefElements()
{
    static thread_local GLuint ar[6];
    memcpy(ar, m_default_elements, sizeof(ar));
    return ar;
}

(http://ideone.com/IvujSq)

请注意,它适用于 C++11。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2011-01-25
    相关资源
    最近更新 更多