0

通过将其他对象复制到新类来创建新类时,我遇到了一些问题。据我所知,下面的代码可以工作,但是我的编译器指出它缺少类材料的默认构造函数。据我所知,这不是必需的。我在这里做错了吗?

第一类构造函数:

    shadingBatch::shadingBatch(const vertexAttribLayout& layout, const material& batchMaterial){
    dataFormat_ = layout;
    batchMaterial_ = *(new material(batchMaterial));
}

我也试过

shadingBatch::shadingBatch(const vertexAttribLayout& layout, const material& batchMaterial){
            dataFormat_ = layout;
            batchMaterial_ = batchMaterial;
        }

但是会返回相同的编译器错误。

二等定义

    class material {
protected:
    shader shader_;
public:
    material (const shader* shaderProgram);
    material (const material&);
    ~material();

    void compileShader();
} ;

第二类复制构造函数

material::material(const material& other){
        shader_ = *(new shader(other.shader_));
    }

编辑:根据要求,

一级定义

class shadingBatch {
    friend class cheeseRenderer;
protected:
    std::vector<primitive*> primitives_;
    std::vector<vertex> vertices_;
    std::vector<GLuint> elements_;
    vertexAttribLayout dataFormat_;
    material batchMaterial_;
    GLuint VAO_;
    GLuint VBO_;
    GLuint EBO_;
public:
    ~shadingBatch();
    GLuint updateBatch (void);
    void addPrimitive (primitive*);
    shadingBatch(const vertexAttribLayout&, const material&);
private:
    void updatePrimitives (void);
    void setVertexAttributes(void);
} ;

以及调用构造函数的位置:

shader* defaultShader = new shader(fragmentSource,vertexSource);
material* defaultMaterial = new material(defaultShader);
vertexAttribLayout* defaultVertexData = new vertexAttribLayout();
shadingBatch* batch = new shadingBatch(*defaultVertexData,*defaultMaterial);
cheeseRenderer renderer(*batch);
4

2 回答 2

4

首先,你应该使用初始化列表。任何未在初始化列表中显式初始化的成员变量对象都将在执行构造函数主体之前调用它的默认构造函数。然后你也做新的,但永远不要删除它(因为你丢失了指针),所以你的构造函数会泄漏内存。试试这个:

shadingBatch::shadingBatch(const vertexAttribLayout& layout, 
                           const material& batchMaterial) :
    dataFormat_(layout)
   ,batchMaterial_(batchMaterial)
{
}

上面假设dataFormat_batchMaterial_都是 class 的成员变量shadingBatch,并且它们在类定义中以该顺序声明,因此如果不是这样,请根据需要进行修复。


material::material还存在内存泄漏和默认构造函数问题,因此您需要以下内容:

material::material(const material& other) : shader_(other.shader_) {}

(如果还有更多工作要做,可能还有更多初始化代码,但你明白了。)

于 2013-02-05T08:17:57.227 回答
1

您所做的不是构建对象,而是在构建内部对象后将参数复制到内部对象中。您想查找初始化列表的概念。您要实现的构造函数如下所示:

shadingBatch::shadingBatch(const vertexAttribLayout& layout, const material& batchMaterial)
  : dataFormat_(layout), batchMaterial_(batchMaterial) // <-- initialization list
{}

如果您没有在初始化列表中显式初始化您的类成员,它们将被默认构造。或者至少,编译器会尝试。Material 似乎没有默认构造函数,因此编译器在您的两次尝试中都会抱怨。

旁注:第一次构造函数尝试有另一个错误,内存泄漏,因为您通过创建一个对象new并且既不存储也不删除结果指针,它的内存(和对象本身)将永远丢失。

于 2013-02-05T08:19:43.690 回答