gpt4 book ai didi

c++ - c++ 中有没有一种方法可以将指针转换为它指向的真实类型?

转载 作者:太空宇宙 更新时间:2023-11-04 16:14:21 24 4
gpt4 key购买 nike

已编辑。见下文。

考虑以下情况 -我有一个基类和一些派生类:

class B {...[virtual...]...};

class D1 : public B {...};

class D2 : public B {...};

我有一个函数,假设对它们中的每一个都有不同的行为(实现方面。从概念上讲,它们都做同样的事情)。现在,我当然会为每个实现一个辅助功能:

void f_aux (B * b);
void f_aux (D1 * d1);
void f_aux (D2 * d2);

然后我可以通过做这样的事情来实现主要功能:

void f (B * bd1d2) {
if (typeid(bd1d2) == typeid(B*) { f_aux((B*)bd1d2); }
else if (typeid(bd1d2) == typeid(D1*) { f_aux((D1*)bd1d2); }
else if (typeid(bd1d2) == typeid(D2*) { f_aux((D2*)bd1d2); }
}

现在,我的问题是 - 我能否以一般方式执行此操作,意思是:

void f (B * bd1d2) {
f_aux(CAST_TO_REAL_TYPE(bd1d2));
}

我尝试直接使用 typeid,当然失败了。我试着在网上搜索,但什么也没找到..

那么,有什么办法吗?如果没有,为什么?

非常感谢..

编辑:

我试图简化问题,但似乎我做了相反的事情..让我再尝试一次 :在实际设置中,我有 3 个类:Line、Ray 和 Segment,我想要另一个类(Graph-Edge)来保存指向任何类型的对象的通用指针——意思是,它有一个字段可以是线射线或线段。现在,我希望可以选择获得 2 个图边的交点,或者一个图边与给定线/射线/线段的交点,而不用处理“这是什么类型的边?”的问题。 “两者都没有。我还希望我的几何类尽可能通用,即使某些功能在 Graph-Edges 中不是必需的。所以我创建了一个父类(super class):LinearObject,带有一个虚拟的 getCut(LinearObject & lo) 函数,并遵循以下答案,到目前为止我得到的最好的是:

class Line;
class Segment;

class LinearObject {
public :
virtual void getCut(LinearObject * lo) { printf("lo->lo\n"); }
private :
virtual void getCut_aux(Line * l) = 0;
virtual void getCut_aux(Segment * s) = 0;

friend class Line; friend class Segment;
};

class Line : public LinearObject {
public :
void getCut(LinearObject * lo) { printf("l->lo\n"); lo->getCut_aux(this); }
private :
void getCut_aux(Line * l) { printf("l->l\n"); }
void getCut_aux(Segment * s) { printf("l->s\n"); }
};

class Segment : public LinearObject {
public :
void getCut(LinearObject * lo) {
printf("s->lo\n");
lo->getCut_aux(this);
}
private :
void getCut_aux(Line * l) { printf("s->l\n"); }
void getCut_aux(Segment * s) { printf("s->s\n"); }
};

int main() {
Line l; Segment s;
LinearObject *lop = &l, *lop2 = &s;
lop->getCut(lop2);
s.getCut(&l);
return 0;
}

它有效,但是,我能做得更好吗(优雅地)?

最佳答案

编辑:在你提出问题后编辑,希望我明白你想要的一切......

#include <cstdio>

class Line;
class Segment;

class LinearObject {
protected :
virtual void getCut_aux(LinearObject *) { printf("LinearObject->getCut_aux\n") ; }

friend class LinearObject_ ;
};

class LinearObject_ : public LinearObject {
public:
void getCut (LinearObject * lo) { printf("getCut()\n"); lo->getCut_aux(this) ; }
};

class Line : public LinearObject_ {
protected :
virtual void getCut_aux(LinearObject *) { printf("Line->getCut_aux\n") ; }

};

class Segment : public LinearObject_ {
protected:
virtual void getCut_aux(LinearObject *) { printf("Segment->getCut_aux\n") ; }
};

int main() {
Line l; Segment s;
LinearObject *lop = &l, *lop2 = &s;
l.getCut(lop2);
s.getCut(&l);
return 0;
}

编辑结束。

如果您可以在类中实现f_aux,就可以利用多态性:

class B {
/* ...[virtual...]... */
virtual void f_aux () { /* ... */ }
};

class D1 : public B {
/* ... */
virtual void f_aux () { /* ... */ }
};

class D2 : public B {
/* ... */
virtual void f_aux () { /* ... */ }
};

然后做:

void f (B * bd1d2) {
bd1d2->f_aux () ; // Will call the correct function depending on what bd1d2 points to
}

编辑:为了回答您的评论,如果您想要类似d->f_aux(b) 的内容,只需添加一个中间类D:

class D {
void f (B *b) { b->f_aux(this) ; }
};

class D1 : public B, public D { /* ... */ };

B *pdb = new B (), *pd3 = new D3 () ;
D1 *pd1 = new D1 () ;
D2 *pd2 = new D2 () ;
pd1->f(b) ;
pd2->f(pd3) ;

关于c++ - c++ 中有没有一种方法可以将指针转换为它指向的真实类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24584727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com