Почему я не могу привести указатель на структуру класса - PullRequest
0 голосов
/ 29 мая 2019

У меня есть Geometry класс

class Geometry
{
public: 
    std::string stdstrType;
    bool bValid;
public:
    Geometry()

    Geometry( std::string strType , bool bValue )

    Geometry(const Geometry &g)

    ~Geometry()     
    virtual void draw();
    bool isValid();
    void setValidState(bool bState);
    virtual void Init();
    std::string GetName();  
};

Какой базовый класс для Geometry объектов, как в этом случае для Sphere class

class Sph : public Geometry
{
public:
    Sph( float radius , float segments );
    ~Sph();
    void init();
    void CleanUp();
    void draw();

private:
    float fRadius, fSegments;
    bool isInited;
    unsigned int m_VAO, m_VBO;
    int iNumsToDraw;
    SumShader shader;
    bool isChanged;
};

У меня есть древовидная структура, содержащая различные объекты Container, а Geometry - это тип данных в объекте Container.

class Container
{
private:
    std::string stdstrContainerName;
    std::string stdstrPluginType;
    Geometry Geom;
}

Поскольку каждый элемент дерева может содержать сферу или прямоугольник, поэтому я хотел бы использовать функцию рисования геометрии для рисования типов объектов Geometry. Для этого, когда я пытаюсь привести любой Geometry тип объекта к Geometry, я получаю сообщение об ошибке.

Sph sphere(0.1 , 32);
Geometry *geom = &sphere;
Container cont("Sphere" , "SPHERE" , *geometry );   
myModel->SetContainer(child, cont);

Конструктор для контейнера

 Container::Container( std::string strName, std::string strType, const 
 Geometry& geometry) : Geom(geometry)
  { 
     stdstrContainerName = strName;
     stdstrPluginType = strType;
  }

 void  TreeModel::SetContainer(const QModelIndex &index, Container Cont)
  {
    TreeItem *item = getItem(index);
    item->setContainer(Cont);
  }


  class TreeItem
   {
    public:
     // Functions here
   private:
     QList<TreeItem*> childItems;
     Container itemData;
     TreeItem* parentItem;
   };

1) Это правильный подход?

2) Как я могу привести Geometry объекты к указателю Geometry?

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

С

Sph sphere();

Вы объявили функцию, которая возвращает объект Sphere и не принимает параметров.

Чтобы объявить объект в Sph, вы просто пишете

Sph sphere; или Sph sphere{};

Полагаю, вы попробовали первый, но он не скомпилировался, поэтому вы просто изменили подпись "до компиляции".Вы объявили пользовательский конструктор , что означает, что компилятор больше не предоставляет вам конструктор по умолчанию , поэтому вы не можете объявить переменную без вызова правильного конструктора (и в вашем случае этоне будет иметь смысла).

В дополнение к

Geometry *geom = new Geometry;
geom = &sphere;

вы создаете новую геометрию указателя, чем мгновенно теряете ее и переназначаете геометрию сферы, которая вообще не имеет смысла.

Более того, все ваши методы являются открытыми в Geometry, и это не имеет смысла (зачем ставить bool valid public, а затем getter?).

в добавочном классе Container содержит экземпляр длябазовый класс, который доставит вам проблемы из-за нарезки объектов, вам нужно использовать указатель или ссылку.

, чтобы просто ответить на ваш вопрос, вы должны создать сферу с

Geometr* geom = new Sphere(1, 5); // random numbers

но самая искренняя и честная вещь, которую я могу сказать, - это переписать все с нуля, а перед этим изучить немного больше, пытаясь с более легким примером.

0 голосов
/ 29 мая 2019

Минимальный код, который работает и реализует идею в вопросе:

#include <iostream>

class Geometry
{
public:
    Geometry(const std::string type) { stdstrType = type; }
    std::string GetName() { return stdstrType; }
    virtual void draw() {} ;
private:
    std::string stdstrType;
};

class Sphere : public Geometry
{
public:
    Sphere(float radius): Geometry("Sphere ") { fRadius = radius; }
    virtual void draw() { std::cout << GetName() << fRadius << "\n";}
private:
    float fRadius;
};

class Container
{
public:
    Container(std::string strName, Geometry* g)
    {
        stdstrContainerName = strName;
        geometry = g;
    }
    void draw() { geometry->draw(); }
private:
    std::string stdstrContainerName;
    Geometry *geometry;
};

int main(int argc, const char * argv[]) {
    Sphere sphere(0.1);
    Geometry *geom = &sphere;
    Container cont("Sphere container", geom);
    cont.draw();
    return 0;
}

Xcode 10.2.1: Нет проблем времени сборки / выполнения.Выход:

Sphere 0.1
Program ended with exit code: 0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...