Inheritance C+中的铸造问题+/CLI-韩元';不编译

Inheritance C+中的铸造问题+/CLI-韩元';不编译,inheritance,casting,c++-cli,Inheritance,Casting,C++ Cli,我在C++/CLI中有以下内容:(注意注释中的错误) 类基类{…} 派生类:公共基{…} 公共引用类CliClass { 公众: std::list*myList; CliClass() { myList=新列表(); } AddToList(派生*派生) { myList->push_back(派生); } DoCast() { 派生*d=nullptr; int n=(int)myList->size(); 对于(int i=0;i

我在C++/CLI中有以下内容:(注意注释中的错误)

类基类{…}
派生类:公共基{…}
公共引用类CliClass
{
公众:
std::list*myList;
CliClass()
{
myList=新列表();
}
AddToList(派生*派生)
{
myList->push_back(派生);
}
DoCast()
{
派生*d=nullptr;
int n=(int)myList->size();
对于(int i=0;i
我想将myList[I]强制转换为派生类型。。但它不允许我


有没有关于如何正确施放的建议?(编译并在运行时是安全的-即,如果输入错误,不会爆炸)

std::list中的C++没有运算符[]。
此外,它是std::list而不是std:list

因此,代码可能正在尝试将列表转换为派生的*,然后可能会尝试对结果使用[]运算符

因此,只需找到另一种存储数据的方法(例如
std::map

大概是这样的:

std::for_each(myList.begin(), myList.end(), DoSomething);

void DoSomething(Base* item)
{
   Derived* d = dynamic_cast<Derived*>(item);

}
std::for_each(myList.begin()、myList.end()、DoSomething);
无效剂量测定(基本*项目)
{
派生*d=动态_铸造(项目);
}
或者直接的方法(如果您没有正确的宏):

for(std::vector::iterator item=myList.begin();item!=myList.end();++item){//遍历“myList”
派生*d=动态_投射(*项);
}

你完全搞错了。假设您的代码中有几个打字错误,并且是
std::list
,那么您当前的意思是:

std::list<Base*> * myList;

/* ... */

myList[i] = /* ... */ ;

这个代码正确吗?我觉得这很可疑。我不知道CLI,但是这个怎么样:1)std:List
实际上是真正的类型吗?2) 您将
myList
声明为对象,然后尝试在
CliClass::CliClass()
中分配指向它的指针--如何?3) 列表没有随机访问权限,为什么要编写
[i]
?@Kerrek SB:1)是的。2) 抱歉,我的列表应该是指针。他补充道。3) 这可能是我的问题吗?它汇编了。。我想我可以通过indexI访问。我从来没有听说过类型
std::List
(大写
L
),这是CLI扩展吗?总之,
myList=newlist()中的
list
的限定类型是什么?最后,通过您现在所做的更改,
myList[i]
myList
视为一个列表数组,当然不是您想要的@Kerrek SB:对不起,大写字母L打错了(我不能把我真正的代码放到网上)。那么,我如何遍历列表呢?(如果你做不到这一点,那不是违背了列表的目的吗?@Kerrek SB:omg。就像我以前有过std::List一样,我告诉过你这是一个打字错误,然后我把std:List。。是的,又是一个打字错误。但你不能把这两者放在一起,然后明白我的意思?你当然知道,但你只是想对我卑鄙。我只是在努力学习,是的,这意味着要学会没有打字错误,但是当你纠正我的时候,你可以试着少一点屈尊俯就。对不起,std::list的打字错误。(我的真实代码中有这一点。我很抱歉,我无法将真实代码放入..机密性/知识产权原因)我仍然希望使用std::list。。我能不能不反复浏览一下这个列表?”因为我觉得如果你做不到的话,这会破坏列表的目的!你能举个例子说明它是如何工作的吗?不确定如何通过for循环的每次传递访问列表中的特定项。可以使用迭代器。或者使用FOREACH宏或std::FOREACH。。。So`list::iterator it;对于(it=myList.begin();it!=myList.end();it++){d=(派生*)it;}`??(我想选择正确的答案,但我仍然不确定如何迭代列表中的每一项并适当地进行转换..也许可以举一个例子来说明如何在你的答案中解决我的问题?)还有其他一些与宏有关的技巧来获得C#-比如foreach循环(比如boost::FOR#each)更好,虽然
d=*it仍然需要强制转换。我还建议使用智能指针而不是原始指针,它确实有助于防止内存泄漏。我在Oh,d'Oh上发布了一个示例,它是从基到派生的,不是从派生到基的--编辑!Re smart pointers:我会有一整页关于这方面的评论,但因为它是CLI,我没有或不知道CLI,所以我会小心。我不知道在多大程度上可以混合CLI和本机构造。例如,您可以将
myList
设置为直接成员对象吗?不,您不能将本机对象作为托管类型的直接成员(想象一下,如果本机对象开始被垃圾收集器移动,会造成多大的混乱!),因此需要一个指针。但要正确管理其生命周期,需要大量的支持代码,因此值得编写一次托管类型智能指针并重用它。请随时在codereview(上面链接)上对我的示例发表评论或提出问题。@Ben:太酷了,谢谢,我会看看的!不幸的是,我没有足够的免费资源来安装C++/CLI环境,所以我缺少一些实际经验,但这听起来是一项非常有前途和重要的技术,应该注意!
for (std::vector<Base*>::iterator item = myList.begin(); item  != myList.end(); ++item ) { //Iterate through 'myList'
   Derived* d = dynamic_cast<Derived*>(*item );
}
std::list<Base*> * myList;

/* ... */

myList[i] = /* ... */ ;
public ref class CliClass
{
public:
  std::list<Base*> * myList;

  CliClass() : myList(new std::list<Base*>()) { }

  DoCast()
  {
    for(auto it = myList->cbegin(), end = myList->cend(); it != end; ++it)
    {
      Derived * const d = dynamic_cast<Derived*>(*it);
      /* do something useful with d */
    }
  }
};