2

iOS と Android の両方のアプリケーションに取り組んでいますが、C++ コードで非常に異なる結果が得られます。私が抱えている問題は、関数に入るとメンバー変数が派生クラスであるということです。例として

int main()
{
   A** arrayOfA = new A[10];
   for (int i = 0; i < 10; ++i)
   {
      arrayOfA[i] = new D();
   }

   return 0;
};
class A
{

// Original code here. After this is the added function and member variable that breaks it

public:
   virtual u32 GetterFunction() = 0;

protected:
   u32 ProblemVariable;
};

class B : A
{
public:
   B(u32 index) { ProblemVariable = index }
   virtual u32 StompedGetter() = 0;
   virtual u32 GetterFunction() { return ProblemVariable; }

   void Initialize()
   {
      u32 sometimesBunkNumber = StompedGetter();
   }

protected:
   u32 StompedVariable;
};

class C : A
{
public:
   virtual u32 GetterFunction() { return 0; }
};

class D : B
{
   B() { Initialize(); }
   virtual StompedGetter() { return StompedVariable; }
}

class E : B
{
   virtual StompedGetter() { return 0; }
}

さて、ここでの問題は、メンバー変数と仮想ゲッターをクラス A に配置するまで、すべてが正常に機能することです。ゲッターが呼び出されると、ランダムな時間にバンク番号が与えられます。それは 2 回動作する可能性があり、その後、不適切な数値を返します (メモリ内の不適切な場所から取得していることは明らかです)。関数が仮想かどうかは問題ではありませんが、理想的なソリューションです。最悪の部分は、これがコンパイルされ、iOS バージョンではうまく動作するが、Android では機能しないことです。明確化として、クラス A の配列でクラス B を初期化するまで実行されます。前もって感謝します!

4

1 に答える 1

0

あなたが示したコードを考えると、私が考えることができる唯一のことは、その行です

A** arrayOfA = new A[10];

代わりに

A** arrayOfA = new A*[10];

あなたが説明する症状は、ある種のメモリ違反を実行していることを示しているようで、A へのポインターへのポインターの配列を A の配列として扱い、後で D を割り当ててそれらの A にアクセスすると、おそらくそれが発生します。メンバー変数が追加される前はおそらく正常に機能していたはずです。以前は空の構造体 (アドレスのサイズ) だったからです。 .

于 2013-06-19T17:48:15.957 に答える