为什么我无法将指针转换为类结构

时间:2019-05-29 06:28:56

标签: c++ c++11

我有一个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 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对象,而GeometryContainer对象中的数据类型。

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 个答案:

答案 0 :(得分:2)

使用

CocoaLumberjack

您已声明一个返回Sphere对象且不带参数的函数。

要向Sph声明一个对象,只需简单地写

Sph sphere(); Sph sphere;

我猜您尝试过第一个,但是没有编译,因此您只是更改了签名“直到编译”。 您已经声明了自定义构造函数,这意味着编译器不再为您提供默认构造函数,因此您不能在不调用正确的构造函数的情况下声明变量(并且在您的情况下就没有意义了。)

除了

Sph sphere{};

您正在创建一个新的指针几何图形,而不是立即泄漏它,并重新分配给一个完全没有意义的球体几何图形。

此外,您的所有方法都是在Geometry中公开的,这是没有道理的(为什么要把布尔有效的公开,然后是一个吸气剂?)。

此外,类Geometry *geom = new Geometry; geom = &sphere; 将一个实例保存到基类中,该类将因对象切片而给您带来问题,您需要使用指针或引用。

仅回答您的问题,您应该使用

Container

但是我能说出的最真实和诚实的事情是从头开始重写所有内容,然后再通过一个简单的示例来研究更多尝试。

答案 1 :(得分:0)

在问题中起作用并实现想法的最小代码:

#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