【问题标题】:Polymorphism and array of pointers (C++)多态性和指针数组 (C++)
【发布时间】:2012-04-20 17:44:48
【问题描述】:

我有以下类:ContainerElement,然后是几个从 Element继承 的类,例如。 按钮、输入法等...

将元素添加到 Container 数组时出现问题,我的 main() 如下所示:

Container c;
c.Add( Button(...) );
c.Add( Input(...) );

其中“...”是一些构造函数参数。

在容器类中,我有一个指针数组来存储属于该容器的所有元素:

Element ** elements;

但我遇到的问题是如何实现 Add 方法,我希望这样的事情能奏效:

void Add(const CControl & newElement){                      
    elements[elemCnt++] = &newElement;              
}

(分配元素数组:elements = new Element * [100];)

但是我得到了这个编译错误:

main.cpp: In member function ‘Container& Container::Add(const Element&)’:
main.cpp:138:23: error: invalid conversion from ‘const Element*’ to ‘Element*’

当我删除 const 限定符时,我收到一个编译错误,提示没有合适的候选者。

问题是,我是 C++ 中的多态性和继承的新手,所以我可能会走错路。最好的方法是什么?

PS: main 方法必须看起来一样,也不建议任何vector或STL的东西。

【问题讨论】:

  • 使用 STL 有什么问题?为什么不想用???它让生活变得如此轻松
  • 您在这里犯了一个重大错误,那就是使用 临时 变量的地址并将其存储起来。 Add 的参数只是临时的,调用结束后对象将被销毁。除此之外,我同意@TonyTheLion,为什么不使用非常好的标准容器?
  • 大概就是这样,我需要复制元素并存储动态分配的副本的地址。我不能使用 STL,因为它是在没有 STL 的环境中测试的分配。
  • 投票关闭,因为过于本地化。 “无法更改main”是一个过于本地化的要求。
  • 调用函数(const type &something)是否过于本地化?这是问题的重点。

标签: c++ arrays inheritance pointers polymorphism


【解决方案1】:

Add 应该带一个指针:

void Add(CControl * newElement){                       
    elements[elemCnt++] = newElement;               
} 

那么你可以这样称呼它

c.Add( new Button(...) ); 
c.Add( new Input(...) ); 

如果您确实无法更改调用代码,则需要以某种方式创建临时副本。 例如。通过在CControlInputButton 中实现一个虚拟的Clone 方法并在Add 中调用它。

void Add(const CControl & newElement){                        
    elements[elemCnt++] = newElement.Clone();
}

【讨论】:

  • elements[elemCnt++] = &newElement; 应该只是 elements[elemCnt++] = newElement;
  • 问题是我需要保持 main() 原样:/
  • 谢谢!这行得通。这有点奇怪,但考虑到约束是唯一明智的做法。
【解决方案2】:

不更改main 就不可能修复此代码,因为您尝试存储对临时的引用。无论您做什么,这都是无法撤消的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多