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

C++ 我必须在这里使用指针吗?,c++,pointers,object,C++,Pointers,Object,我一次又一次地遇到这个问题,我总是必须使用一个前向声明和一个指针来解决它 < C++似乎需要一个工作来实现对象的协作。有没有什么方法可以在不使Mesh*成为类形状的指针(或者将向量转换为向量)的情况下编译此文件 形状.h 网格.h 不能将不完整的类型声明为成员。 当您向前声明一个类型时,编译器只知道该类型存在;它不知道任何关于大小、成员或方法的信息。它被称为不完整类型 除非包含Mesh.h,Mesh是不完整类型,并且不能将不完整类型声明为成员 但是,作为成员,您可以有一个指向不完整类型的指针,因

我一次又一次地遇到这个问题,我总是必须使用一个前向声明和一个指针来解决它

< C++似乎需要一个工作来实现对象的协作。有没有什么方法可以在不使Mesh*成为类形状的指针(或者将
向量
转换为
向量
)的情况下编译此文件

形状.h 网格.h 不能将不完整的类型声明为成员。

当您向前声明一个类型时,编译器只知道该类型存在;它不知道任何关于大小、成员或方法的信息。它被称为不完整类型

除非包含
Mesh.h
Mesh
不完整类型
,并且不能将不完整类型声明为成员

但是,作为成员,您可以有一个指向
不完整类型的指针,因此如果您向前声明
类Mesh
,则您的成员必须是
Mesh*


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

你一直做得很好,没有其他方法可以做到。

你似乎基本上是说一个形状是用网格实现的,而网格是用形状(特别是三角形)实现的。这显然没有意义。

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

它在没有指针的情况下对我有效(当然,在
std::vector
中使用指针)。您只需仔细分析您的依赖关系。
三角形
继承
形状
,因此
形状
的定义高于
三角形
形状
包含一个
网格
,因此
网格
的定义先于
形状
。这给出了顺序:
网格,形状,三角形
,其中


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

编译器必须知道类中所有成员的大小。否则它无法为对象分配适当的空间。@Bo:
sizeof(vector)
不一定依赖于
sizeof(triangle)
。我不明白。你有一个形状,它拥有一个由三角形列表组成的网格,每个形状都拥有一个由三角形列表组成的网格?@Andre:如果允许某些列表为空,这就行了,而网格/形状似乎不是这样。那么,你想要的是每个
三角形都是
,通过其基类的
网格
数据成员,包含一个
三角形的向量
。假设您希望此向量的大小为1,但它到底包含什么?一个三角形,它有自己的向量等。即使您用指针打破循环依赖,也没有地方定义顶点的坐标。因此定义仍然是圆形的,无法实际定义三角形。通常的解决方法是不从形状继承三角形-生成
三角形
三个点,网格大小为1的
形状
恰好是三角形。@bobobo:刚编辑完,它可以是指针,并注意到您的注释:)这个答案是正确的,但这无关紧要<代码>网格
没有任何类型为
三角形
的成员。
三角形
的向量需要包含三角形。hheader@Neil当前位置我认为他举了一个坏例子。在很多情况下,这样的包含是适当的,最终以子对象的空集合结束。@Ben,这对我来说比OP所做的更有意义。@Neil:想想目录树(在一个文件系统中,它实际上是一棵树,不允许硬链接)。每个节点都有一个子节点的集合。最终,您必须到达子集合为空的叶节点。@Ben抱歉,这不会使我的船漂浮。OP的数据结构不是树,树只由一种类型-节点组成。@尼尔:OP的数据结构是树(如果只查看结构而忽略名称)。目录树同时有目录和文件,两种类型的节点。这不是一个更好的设计<代码>类别三角形1
类别三角形2
,是否复制了代码?绝对是个大杂烩。
#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