Должен ли я _ использовать здесь указатель? - PullRequest
0 голосов
/ 11 июня 2011

Я снова и снова сталкивался с этой проблемой, и мне всегда приходилось решать ее, используя предварительное объявление и указатель.

Кажется неправильным, что 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 ]

3 голосов
/ 11 июня 2011

Вы, кажется, в основном говорите, что Shape реализован с использованием Mesh, а Mesh реализован с использованием фигур (в частности, треугольников). Это, очевидно, не имеет смысла.

2 голосов
/ 11 июня 2011

Вы не можете объявить неполный тип как член.

Когда вы пересылаете объявление типа, все, что знает компилятор, это то, что этот тип существует;он ничего не знает о размере, элементах или методах.Он называется Неполный тип

Если вы не включите Mesh.h, Mesh является Incomplete type и вы не можете объявить неполный тип как член.

Но, вы можете иметь указатель на Incomplete type в качестве участника и поэтому, если вы отправите объявление class Mesh, ваш участник должен будет Mesh*

Итак, в заключение, чтоВы сказали, что это правильно.

1 голос
/ 11 июня 2011

У меня работает без указателя (естественно, внутри std::vector используются указатели). Вам просто нужно тщательно проанализировать свои зависимости. Triangle наследует Shape, поэтому определение Shape выше Triangle. Shape содержит Mesh, поэтому определение Mesh предшествует Shape. Это дает порядок: Mesh, Shape, Triangle, который компилируется без ошибок.

Естественно, некоторые сетки должны иметь пустые векторы, так как каждый треугольник внутри самого вектора требует сетки.

1 голос
/ 11 июня 2011

Вы можете определить свою сетку в виде другой простой структуры треугольника низкого уровня.Ваша «форма» треугольника высокого уровня может делиться кодом столкновения с кодом низкого уровня, оставаясь при этом отдельным классом.Таким образом, Mesh.h не должен включать Triangle.h.Это нарушит вашу циклическую зависимость и позволит вам иметь член Mesh в классе Shape.

1 голос
/ 11 июня 2011

Вы всегда делали это правильно, и другого способа сделать нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...