【问题标题】:problem with an abstract type as class member variable抽象类型作为类成员变量的问题
【发布时间】:2011-09-24 03:01:04
【问题描述】:

我尝试在我的类定义中使用抽象类类型作为成员变量,但不知何故它有一些问题。这是抽象类类型:

class POINT{
   public:
       virtual int point_dim() = 0;
       /*other virtual functions...*/ 
}

这里是继承的类:

class POINTX : public POINT{
   public:
       int point_dim(){return 10;}
}

我再创建一个类使用POINT作为成员变量,由于POINT是纯虚类,所以只能声明为指针:

class SPACE{
   public:
       POINT* m_point;
       /*some other declarations*/
}

但是当我在我的 main 中使用它时,它并没有像我预期的那样工作:

int main(){
    POINTX *ptx = new POINTX();
    SPACE space;
    space.m_point = (POINT*)ptx;
    //some function call use POINT as parameter(pass by reference):
    func(*space.m_point, ....);
}

调用 func(space.m_pint) 时发生错误。但是,如果我在没有类 SPACE 的情况下这样做,没关系。例如:

int main(){
    POINTX *ptx = new POINTX();
    POINT *m_point = (POINT*)ptx;
    //some function call use POINT as parameter(pass by reference):
    func(*m_point, ....);
}

有人知道怎么回事吗?

【问题讨论】:

  • POINTX 类缺少 const。不需要演员表。 func() 应该将引用作为参数。
  • 对任何问题的一般建议:它怎么不起作用?会发生什么,它与您期望发生的有什么不同?这个问题的具体建议:func的定义是什么? func 的第一个参数实际上是什么可能会有所不同。

标签: c++ class virtual


【解决方案1】:

POINT 声明:

   virtual int point_dim() const = 0;

因此POINTX 必须有一个const 方法称为point_dim

   int point_dim() const {return 10;}

没有这个,它将有两个point_dim()方法,一个非const和一个const但纯virtual,留下POINTX作为抽象。

只要func() 有一个引用POINT

int func(const POINT& pt)
{
    const int dim = pt.point_dim();
    // ...
}

你可以这样称呼它:

func(*space.m_point);

另外,请注意这里不需要 C 风格的演员表:

space.m_point = ptx;

完成后别忘了delete ptx

【讨论】:

  • 在这种情况下,new POINTX 行会编译吗?
  • @DennisZickefoose:我不会这么认为。我怀疑这是非常模棱两可的“但不知何故它有一些问题。”
  • @Johnsyweb,感谢您的回答。 const 是一个错误,对此感到抱歉。实际上 func() 是另一个类中的成员函数,但我想只要它需要引用它就没有任何区别。但是 func(*space.m_point) 被调用时出现了分段错误错误......而且 func(*m_point) 工作正常,我不明白!
  • @hsienting:如果没有真正的代码或对问题的正确描述,我们将无能为力。 “func(*m_point) 正常工作”不是对问题的描述。
  • @hsienting:func 是另一个类的成员函数这一事实不太可能改变任何事情。 ideone.com/TgiEK 证明这段代码可以工作并返回10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2012-05-25
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多