我必须在这里使用指针吗?

时间:2011-06-11 17:06:23

标签: c++ pointers object

我遇到了这个问题时间&再次,我总是必须使用前向声明和指针来解决它。

C ++ 需要解决以使对象合作似乎是错误的。有没有办法让这个编译没有使Mesh *成为类Shape中的指针(或者vector<Tri>成为vector<Tri*>

Shape.h

#ifndef S
#define S

#include "Mesh.h"
//class Mesh ; //delete line above, uncomment this to make it work
class Shape // a mathematical shape
{
    Mesh mesh ; // the poly mesh repr' this math shape
    //Mesh *mesh ; // make it work

    // a shape must be intersectable by a ray
    //virtual Intersection intersects( const Ray& ray )=0 ;
} ;

#endif

Mesh.h

#ifndef M
#define M

#include <vector>
using namespace std;
#include "Triangle.h"

struct Mesh
{
    vector<Triangle> tris ; // a mesh is a collection of triangles
} ;

#endif

Triangle.h

#ifndef T
#define T
#include "Shape.h"
class Triangle : public Shape
{
    // a triangle must be intersectable by a ray
    // a triangle's mesh is simple but it is still a mesh (1 poly)
} ;
#endif

5 个答案:

答案 0 :(得分:3)

你似乎基本上是说使用Mesh实现Shape,使用形状(特别是三角形)实现Mesh。这显然没有意义。

答案 1 :(得分:2)

您无法将不完整类型声明为成员。

当你转发声明一个类型时,所有编译器都知道这个类型存在;它对尺寸或成员或方法一无所知。它被称为 不完整类型

除非您包含Mesh.h,否则MeshIncomplete type,您不能将不完整类型声明为成员。

但是,您可以指向Incomplete type作为会员,因此如果您转发声明class Mesh,您的会员必须是Mesh*

总而言之,你所说的是正确的。

答案 2 :(得分:1)

你总是做得对,没有其他方法可以做到。

答案 3 :(得分:1)

您可以根据不同的,简单的低级三角形结构来定义网格。您的高级三角形“形状”可以与低级别共享碰撞代码,同时仍然是一个单独的类。因此Mesh.h不需要包含Triangle.h。这将破坏您的循环依赖关系,并让您在Shape类中拥有一个Mesh成员。

答案 4 :(得分:1)

它适用于我没有指针(当然,std::vector内部使用指针)。您只需仔细分析您的依赖项。 Triangle继承Shape,因此Shape的定义高于TriangleShape包含Mesh,因此Mesh的定义位于Shape之前。这会给出订单:Mesh, Shape, Trianglecompiles without errors.

当然,有些网格必须有空向量,因为向量内部的每个三角形都需要一个网格。