2012-01-10 34 views
0

我有以下的頭文件:'沒有指定類型' 在C的誤差++

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <stddef.h> 
#include <GL/glew.h> 
#include <GL/glfw.h> 
#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 
#include <glm/gtc/type_ptr.hpp> 
#include <stdlib.h> 
#include <vector> 

class Sphere 
{ 
    public: 
     Sphere(); 
     int count_sphere_vertices(int ,int, int); 
     Vertex* create_sphere(int ,int , int); 
}; 
現在當我編譯我的代碼

我得到這個:

Sphere.h:18:3: error: ‘Vertex’ does not name a type 
Sphere.cpp:48:1: error: ‘Vertex’ does not name a type 

test_1.cpp: In function ‘int main()’: 
test_1.cpp:318:38: error: ‘class Sphere’ has no member named ‘create_sphere’ 

什麼是

'頂點'沒有指定一個類型

是指?爲什麼我得到

'類球形' 沒有成員名爲 'create_sphere'

因爲我有這在我的Sphere.cpp:

//Calculating points for the sphere (the algorithm is implemented here) 
Vertex* Sphere::create_sphere(int dtheta,int dphi, int no_vertices) 
{ 

    GLdouble x,y,z,x2,y2,z2; 
    GLdouble magnitude=0; 
    int n=-1; 
    int theta,phi; 
    const double PI = 3.1415926535897; 
    GLdouble DTOR = (PI/180);//degrees to radians 
    Vertex* sphere_vertices = new Vertex[no_vertices]; 


    for (theta=-90;theta<=90-dtheta;theta+=dtheta) { 
     for (phi=0;phi<=360-dphi;phi+=dphi) { 

    //calculating Vertex 1 
    x = cos(theta*DTOR) * cos(phi*DTOR); 
    y = cos(theta*DTOR) * sin(phi*DTOR); 
     z = sin(theta*DTOR); 

    n+=1; 
    sphere_vertices[n].position[0] = x; 
    sphere_vertices[n].position[1] = y; 
    sphere_vertices[n].position[2] = z; 


    //calculating Vertex 2 
     x = cos((theta+dtheta)*DTOR) * cos(phi*DTOR); 
     y = cos((theta+dtheta)*DTOR) * sin(phi*DTOR); 
     z = sin((theta+dtheta)*DTOR); 

    n+=1; 
    sphere_vertices[n].position[0] = x; 
    sphere_vertices[n].position[1] = y; 
    sphere_vertices[n].position[2] = z; 

    //calculating Vertex 3 
    x = cos((theta+dtheta)*DTOR) * cos((phi+dphi)*DTOR); 
    y = cos((theta+dtheta)*DTOR) * sin((phi+dphi)*DTOR); 
    z = sin((theta+dtheta)*DTOR); 

    n+=1; 
    sphere_vertices[n].position[0] = x; 
    sphere_vertices[n].position[1] = y; 
    sphere_vertices[n].position[2] = z; 

    //adding Vertex_1 again to divide the Quad into 2 triangles so it can be later filled with triangles!!!  
    //adding Vertex 1 again! 
    x = cos(theta*DTOR) * cos(phi*DTOR); 
    y = cos(theta*DTOR) * sin(phi*DTOR); 
     z = sin(theta*DTOR); 

    n+=1; 
    sphere_vertices[n].position[0] = x; 
    sphere_vertices[n].position[1] = y; 
    sphere_vertices[n].position[2] = z; 

     if (theta > -90 && theta < 90) { 

      //calculating Vertex 4 
      x = cos(theta*DTOR) * cos((phi+dphi)*DTOR); 
      y = cos(theta*DTOR) * sin((phi+dphi)*DTOR); 
      z = sin(theta*DTOR); 

      n+=1; 
      sphere_vertices[n].position[0] = x; 
      sphere_vertices[n].position[1] = y; 
      sphere_vertices[n].position[2] = z; 

      } 
     } 
    } 

    //Setting the color 
    for(int i=0; i<no_vertices; i+=1) 
    { 
     sphere_vertices[i].color[0] = 1; 
     sphere_vertices[i].color[1] = 0; 
     sphere_vertices[i].color[2] = 0; 
    } 
    printf("%d >> \n", n); 

    return sphere_vertices; 
} 

Thansk

編輯: 這是包括在我的test_1.cpp「主」方法所在。

#include "Sphere.h" 
#include "Terrain.h" 

using namespace std; 

//Vertex Structure 
struct Vertex { 

    GLdouble position[3]; 
    GLfloat color[3]; 
    GLfloat texture[2]; 
}; 

然後我創建一個球體這樣

sphere_vertices_final = planet_1->create_sphere(5,5,no_sphere_vertices); 

我應該如何包含頂點在Sphere.h文件?

+0

您錯過了'Vertex'聲明。也許你忘了'#include'它的頭部?如果聲明在同一個文件中,則需要在* Sphere的定義之前放置該聲明。另一個錯誤就是第一個雪球效應。 – 2012-01-10 11:43:55

+0

它的標頭?頂點只是一個結構變量。我應該如何包括它? – 2012-01-10 11:46:13

+0

如果它不在單獨的標題中,它需要超出「Sphere」的定義。 – 2012-01-10 11:47:45

回答

4

這意味着編譯器不知道Vertex是什麼。它沒有在您包含的任何頭文件中定義(或沒有正確定義)。因此,試圖返回一個指針的函數也不能被編譯。

因爲你只處理一個指針Vertex在這裏你的頭文件,你可以轉發聲明類:

class Vertex; 

class Sphere 
{ 
    public: 
     // ... 

......但後來,你必須有正確的定義在訪問任何方法或類的其他成員之前,您的cpp文件。

+0

我的頂點是Sphere.cpp中的結構 – 2012-01-10 11:58:10

+0

編輯:OK找到了它,我還必須在test_1.cpp和Sphere.cpp中聲明Vertex,並在test_1.cpp和Sphere.cpp中包含Sphere.h – 2012-01-10 12:03:52

+1

@TestTest:這樣做的正確方法是將頂點結構放入其自己的.h文件中,在隨附的.cpp中的頂點上實施所有操作,然後添加該包含文件。一個很好的規則是「每個類或結構有一對頭文件源」 - 唯一的例外是隻能用於文件主類的輔助類或類型。 – datenwolf 2012-01-10 12:25:10

0

Vertex的定義是什麼?也許你需要一個命名空間?
第二個錯誤是由第一個錯誤引起的:由於編譯器不知道Vertex *是什麼,它不能創建create_sphere函數。

1

「頂點」沒有指定類型

這意味着,編譯器沒有見過的Vertex聲明,所以不知道這是一個類型。據推測,它在頭文件中定義,你不包括;你應該在你的頭文件中包含它。

(如果它是一個類類型,那麼你只需要預先聲明(class Vertex;)添加到您的Sphere.h,幷包括來自Sphere.cpp頭。這將是一個更好的選擇,因爲它不引入頭文件。依賴性)

'類球形' 沒有名爲 'create_sphere' 構件

這是以前的錯誤的結果;編譯器無法理解create_sphere的聲明,所以不知道它是否存在。修復第一個錯誤也會解決這個問題。