如何解决我要在这里使用指针吗?
| 我一次又一次地遇到了这个问题,而且我总是不得不使用前向声明和指针来解决它。 C ++需要变通才能使对象进行协作似乎是错误的。有没有什么方法可以编译它而无需使Mesh *成为Shape类中的指针(或将“ 0”变成“ 1”)? 形状#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
网格
#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
三角形
#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
解决方法
它对我有用,没有指针(naturally5ѭ中自然使用指针)。您只需要仔细分析依赖关系即可。
Triangle
继承Shape
,因此Shape
的定义高于definition6ѭ的定义。 Shape
包含Mesh
,因此Mesh
的定义在Shape
\之前。这给出了顺序:Mesh,Shape,Triangle
,它将正确编译。
自然,某些网格必须具有空矢量,因为矢量内部的每个三角形本身都需要一个网格。
, 您似乎基本上是在说使用网格实现形状,而网格是使用形状(特别是三角形)实现的。这显然是没有道理的。
, 您不能将不完整的类型声明为成员。
当您向前声明一个类型时,所有编译器都知道该类型存在。它对大小,成员或方法一无所知。称为不完整类型
除非包含Mesh.h
,否则Mesh
是Incomplete type
,并且您不能将不完整的类型声明为成员。
但是,您可以将Incomplete type
作为成员的指针,因此如果向前声明class Mesh
,则您的成员必须为be20ѭ
因此,总而言之,您所说的是正确的。
, 您总是做对了,没有其他方法可以做到。
, 您可以根据不同,简单的低级三角形结构来定义网格。您的高级三角形“形状”可以与低级三角形共享碰撞代码,同时仍是一个单独的类。因此,Mesh.h不必包含Triangle.h。这将打破您的循环依赖性,并使您在Shape类中拥有一个Mesh成员。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。