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() を呼び出そうとするとセグメンテーション違反が発生します。

foo(); を呼び出すには、inheritFromABS 型と InheritFromABS 型のオブジェクトのリストが必要ですか? それぞれ?

編集:これは、セグメンテーション違反で失敗する私の実際のコードです:

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 型のオブジェクトの 1 つが含まれており、VariableExprAST の codegen を呼び出す必要があります。コードは次のとおりです。

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

すべてが単一の警告なしで準拠していますが、単純な入力を提供すると、tmp->Codegen(); の直前で segfault で失敗します。

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 に答える