1

正常に機能していたクラスに問題があり、今ではまったく機能したくないようです。

エラーは"No appropriate default constructor available"

私はそれらのリストを作成し、初期化してからリストに追加している2つの場所でクラスを使用しています。

Vertice3f.h

#pragma once 
#include "Vector3f.h"

// Vertice3f hold 3 floats for an xyz position and 3 Vector3f's 
//  (which each contain 3 floats) for uv, normal and color

class Vertice3f{
private:
    float x,y,z;
    Vector3f uv, normal, color;

public:
    // If you don't want to use a UV, Normal or Color 
    //  just pass in a Verctor3f with 0,0,0 values
    Vertice3f(float _x, float _y, float _z, Vector3f _uv, 
              Vector3f _normal, Vector3f _color);
    ~Vertice3f();
};

Vertice3f.cpp

#include "Vertice3f.h"

Vertice3f::Vertice3f(float _x, float _y, float _z, 
                     Vector3f _uv, Vector3f _normal, Vector3f _color){
    x = _x;
    y = _y;
    z = _z;
    uv = _uv;
    normal = _normal;
    color = _color;
}

次のように OBJModelLoader クラスで使用しています。

list<Vertice3f> vert3fList;

Vertice3f tvert = Vertice3f(
            x = (float)atof(
            vertList[i].substr(
                vertList[i].find("v") + 1,
                vertList[i].find(" ", vertList[i].find("v") + 2, 10)
                ).c_str()
            ),
            y = (float)atof(
                vertList[i].substr(
                    vertList[i].find(" ", vertList[i].find("v") + 4, 10) + 1,
                    vertList[i].find(" ", vertList[i].find("v") + 13, 10)
                ).c_str()
            ),
            z = (float)atof(
                vertList[i].substr(
                vertList[i].find(" ", vertList[i].find("v") + 13, 10) + 1,
                vertList[i].find(" ", vertList[i].find("v") + 23, 10)
                ).c_str()
            ),
            ::Vector3f(0.0f,0.0f,0.0f),::Vector3f(0.0f,0.0f,0.0f),::Vector3f(0.0f,0.0f,0.0f)
        );

        vert3fList.push_back(
            tvert
        );

私はデフォルトのコンストラクターを自分で定義しようとしたので、.hに入れました

Vertice3f();

そしてcppで

Vertice3f::Vertice3f(){
x = 0.0f;
y = 0.0f;
z = 0.0f;
uv = Vector3f(0.0f,0.0f,0.0f);
normal = Vector3f(0.0f,0.0f,0.0f);
color = Vector3f(0.0f,0.0f,0.0f);
}

したがって、デフォルトのコンストラクターが見つからない理由や、コンパイラーを緩和する方法がわかりません。コンパイラはおそらく自分が何をしているのかを知っているので、それはユーザーエラーだと確信しています。ご不明な点がございましたら、お気軽にお問い合わせください。

4

1 に答える 1

2

Vector3f欠落しているデフォルトのコンストラクターは、クラスではなく、クラスのデフォルトのコンストラクターであると思いますVertice3f。あなたのコンストラクターは、そのメンバーVertice3fをデフォルトで構築しようとするため、エラーが発生します。Vector3f

Vertice3fこれが、デフォルトのコンストラクターを提供しようとしても何も変わらない理由です。問題は、ここでもありますVector3f

それを修正するには、必要なすべてのデフォルト コンストラクターを提供するか (それが設計と一致していると仮定)、またはVertice3f本体内割り当ての代わりに初期化子リストを使用してコンストラクターを書き直します。

Vertice3f::Vertice3f(float _x, float _y, float _z, 
                     Vector3f _uv, Vector3f _normal, Vector3f _color) :
    x(_x), y(_y), z(_z), uv(_uv), normal(_normal), color(_color)
  {}

このバージョンでは、何もデフォルト構築しようとしなくなりました。いずれにせよ、本体内の割り当ての代わりに初期化子リストを使用することをお勧めします。

于 2012-11-16T01:20:27.780 に答える