0

我希望你们中的任何一位优秀的绅士可以帮助我澄清一些事情。

说我有以下代码:

class someABC{
  virtual void foo() = 0;
}

以及从它继承的另一个类:

class inheritFromABS : public someABC
{
  inheritFromABS();
  void foo();
}

和另一个也继承自 someABC 的类:

class alsoInheritFromABS : public someABC
{
  alsoInheritFromABS();
  void foo();
}

现在我有一个 someABC 类型的对象列表,如下所示:

  list<someABC *> myList;
  inheritFromABS *first = new inheritFromABS();
  alsoInheritFromABS *second = new alsoInheritFromABS();
  myList.push_back(first);
  myList.push_back(second);

我想遍历 myList 并在每个上调用 foo() 。这甚至可行吗?它编译时没有错误或警告,但是当我尝试调用 foo() 时出现分段错误。

我是否需要拥有类型为 inheritFromABS 和 alsoInheritFromABS 的对象列表才能调用 foo(); 每个?

编辑:这是我的实际代码,它因分段错误而失败:

llvm::Value *decafStmtList::Codegen() {
for(list<decafAST*>::iterator i = stmts.begin(); i != stmts.end(); i++)
{
    decafAST *tmp = *i;    
    tmp->Codegen();
}
return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
}

因此,stmts 包含 VariableExprAST 类型的对象之一,我希望它调用 VariableExprAST 的 codegen,代码如下:

llvm::Value *VariableExprAST::Codegen() {
    cout << "I am here" << endl;
    return 0;//FIXME: im broken
}

一切都没有一个警告,但是一旦我提供了一个简单的输入,它就会在 tmp->Codegen(); 之前失败并出现段错误。

4

1 回答 1

0

您正在尝试的内容看起来是正确的,但您需要在列表中存储指针。目前尚不清楚您当前的代码将如何编译,但您可能打算这样做:

list<someABC *> myList;
inheritFromABS* first = new inheritFromABS();
alsoInheritFromABS* second = new alsoInheritFromABS();
myList.push_back(first);
myList.push_back(second);

inheritFromABS* first = ...代替inheritFromABS first = .... 您还应该向基类添加一个虚拟析构函数。

这是一个简单的工作示例,遵循经典主题。请注意,在实际应用程序中,您将使用智能指针而不是原始指针。此示例缺少内存解除分配。

#include <iostream>
#include <list>

struct Animal
{
  virtual void talk() const =0;
  virtual ~Animal() {}
};

struct Dog : Animal
{
  void talk() const { std::cout << "Woof woof!\n"; }
};

struct Cow : Animal
{
  void talk() const { std::cout << "Moooo!\n"; }
};

int main()
{
  std::list<Animal*> animals;
  animals.push_back(new Dog);
  animals.push_back(new Cow); 
  animals.push_back(new Dog);
  animals.push_back(new Cow);
  animals.push_back(new Dog);
  animals.push_back(new Cow);

  for (std::list<Animal*>::const_iterator it = animals.begin();
       it != animals.end();
       ++it)
  {
    (*it)->talk();
  }
}
于 2012-11-13T07:12:37.990 回答