2012-11-16 6 views
1

잘 작동하는 클래스에 문제가있어 이제는 전혀 작동하지 않는 것 같습니다. 내가 그들의 목록을 만들고 목록에 추가 한 후 초기화하고있어 두 곳에서 클래스를 사용하고 "No appropriate default constructor available"기본 생성자가 없습니다.

오류입니다.

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 
     ); 

내가 정의하는 시도 드 내가

Vertice3f(); 

을 넣어 .H 그렇게 자신을 생성자 결함과 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); 
} 

그래서, 나는 그것이 기본 생성자를 찾을 방법이나 컴파일러를 달래 수없는 이유를 잘 모르겠어요 . 나는 그것이 컴파일러가 아마 그것이 무엇을하는지 알기 때문에 그것은 사용자 에러라고 확신한다. 도움을 주시면 대단히 감사하겠습니다. 질문이 있으시면 답변 드리겠습니다.

+0

'Vertice3f();'가 public으로 선언 되었습니까? – Fraser

+0

솔루션을 코드에 직접 수정하여 작업해야하는 버전의 전체 버전을 확인할 수 있습니다. – Potatoswatter

+0

예. 그것은 공개로 선언됩니다. 또한 "코드에 직접 솔루션을 수정하십시오"라는 것이 무슨 뜻인지 잘 모르겠습니다. 전체 파일이나 sln 파일을 원한다는 뜻입니까? – user962179

답변

2

누락 된 기본 생성자는 클래스가 아닌 Vector3f 클래스의 기본 생성자라고 생각합니다. Vertice3f의 생성자가 Vector3f 멤버를 기본 생성하려고 시도하며 이로 인해 오류가 발생합니다.

여기에 Vertice3f에 대한 기본 생성자를 제공하려는 시도는 아무 것도 변경하지 않습니다. 문제는 다시 Vector3f입니다.

를 해결하려면 중 하나 (가정 그것은 당신의 디자인에 동의) 필요한 모든 기본 생성자를 제공하거나, 더 이상 시도

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) 
    {} 

이 버전의 초기화 목록을 사용하여 대신에 몸 할당 Vertice3f의 생성자를 다시 작성 어떤 것을 디폴트로 짓는 것. 그리고, 체내 할당 대신에 초기화리스트를 사용하는 것은 좋은 생각입니다.

+0

이것이 문제였습니다. 오류를 너무 빨리 읽고 Vector3f를 Vertice3f로 읽었습니다. 도와 주셔서 감사합니다. – user962179

관련 문제