作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我确信这个问题之前已经被问过和回答过,但是如果没有正确的术语,我在搜索时遇到了麻烦。
我有两个独特的结构 A 和 B(不是类)。我的代码使用函数重载来区别对待结构。我不明白如何处理声明多态性。我为伪代码示例道歉。
if( flag ==1 ){
declare stuct A scoped to main
}
else{
declare stuct B scoped to main
}
上面的伪代码将不起作用,因为声明在 if 语句的范围内。由于我试图描述的范围问题,我的“真实”代码无法编译。
编辑
澄清:
根据指定的标志 (arg),我想声明两个不同结构之一。一旦声明了正确的结构,所有多态性都已通过操作重载处理。
谢谢
最佳答案
这个问题基本上与结构、类或多态无关(尽管解决方案确实需要后者)。
它是关于尝试有条件地声明不同类型的对象,而不与 block 作用域冲突。简单的答案是你不能。
通常的方法是使用延迟初始化的智能指针:
#include <memory>
#include <cstdlib>
struct A { virtual ~A() {} };
struct B : A {};
struct C : A {};
void f(A&);
int main()
{
srand(time(0));
const int x = rand();
#if 0
/** Can't do this: **/
if (x > 500)
B obj;
else
C obj;
f(obj);
#endif
/** Can do this: **/
std::unique_ptr<A> ptr;
if (x > 500)
ptr.reset(new B);
else
ptr.reset(new C);
f(*ptr);
#if 0
/** Some older examples may propose this: **/
A* ptr = NULL;
if (x > 500)
ptr = new B;
else
ptr = new C;
f(*ptr);
delete ptr;
ptr = NULL;
#endif
}
因为 f
接受一个引用,所以即使你给它提供一个 A
也会保持多态。
通常您实际上会通过 ptr
调用成员函数,使用虚拟分派(dispatch)来确保执行正确的代码:
std::unique_ptr<A> ptr;
if (x > 500)
ptr.reset(new B);
else
ptr.reset(new C);
ptr->someFunction();
不需要函数重载。
关于c++ - 多态结构声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23138929/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!