سؤال

مرحبًا يا من هناك!أقوم بهذا المشروع والآن أحاول:

  1. إنشاء بعض الكائنات وتخزينها في المتجهات، والتي يتم تخزينها في متجه آخر V
  2. التكرار من خلال المتجهات داخل V
  3. التكرار من خلال الكائنات الموجودة داخل المتجهات الفردية

على أية حال، كنت أبحث للتو في الويب وعثرت على وظيفة stl for_each.يبدو الأمر أنيقًا جدًا ولكني أواجه مشكلات معه.أحاول استخدامه بهذه الطريقة:

for_each(V.begin(), V.end(), iterateThroughSmallVectors);

التكرار ....ببساطة يفعل الشيء نفسه على المتجه الذي تم تمريره إليه ..

الآن أتلقى خطأ وقت التشغيل الغريب "Vector iterators غير متوافق".لقد بحثت فيه ولم أجد أي مدخلات مفيدة في هذا الشأن..

لا أعرف ما إذا كان ذلك مفيدًا، لكن V عبارة عن ناقل خاص <> مُخزن في الفئة A، والذي يحتوي على موصل إليه، وأحاول التكرار من خلاله في الفئة B عن طريق القيام بما يلي:

A->getV().begin(), A->getV().end(), etc..

هل لدى أي شخص أي فكرة عما يحدث؟

يحرر:حسنًا، أعتقد أنه من الأفضل نشر الكود فقط، وحيثما قد تظهر المشكلات...

getTiles في gameState.h:

vector<vector<tile*>> getTiles();

حلقات for_each في main.cpp:

for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);
.
.
void drawTiles(vector<tile*> row)
{
for_each(row.begin(), row.end(), dTile);
}
void dTile(tile *t)
{
t->draw();
}        

إنشاء المتجهات:

int tp = -1;
int bCounter = 0;
int wCounter = 0;
for (int i = 0; i < 8; i++)
{
vector<tile*> row(8);
    for (int j = 0; j < 8; j++)
    {
    tile *t = new tile(tp, (i+(SIDELENGTH/2))*SIDELENGTH,
        (j+(SIDELENGTH/2))*SIDELENGTH);
    row.push_back(t);
            tp *= -1;
    }
currState->setTiles(row);
    tp *= -1;
}

وفقط في حالة أنه قد يكون ذا صلة:

void gameState::setTiles(vector<tile*> val)
{
    tiles.push_back(val);
}

هل من الأسهل اكتشاف المشكلة الآن؟أتمنى ذلك...وإذا اكتشفت أي أشياء غبية قد أفعلها، فيرجى إبلاغي بذلك، فأنا جديد نوعًا ما على لغة C++ وما زالت المؤشرات والمراجع تربكني.

تحرير 2:شكرا يا رفاق، لقد نجح الأمر بشكل مثالي...حسنًا بالنسبة لهذه المشكلة، يبدو الآن أن لدي مشكلة في إنشاء المربعات وتثبيتها في متجه الصف..يبدو أنه حتى من خلال إنشاء المتجه وتمريره بشكل صحيح، فإن المربعات التي كان من المفترض أن تكون موجودة فيه (يتم فقدها بعد:

    for (int j = 0; j < 8; j++)
    {
    tile *t = new tile(tp, (i+(SIDELENGTH/2))*SIDELENGTH,
        (j+(SIDELENGTH/2))*SIDELENGTH);
    row.push_back(t);
            tp *= -1;
    }

حلقة.إذا كان لدى أي منكم أي أفكار جيدة حول حل هذه المشكلة، فنحن نرحب بمساعدتي؛) في هذه الأثناء، سأستمر في محاولة إصلاحها

هل كانت مفيدة؟

المحلول

ما هو النموذج الأولي ل A::getV()?

أنا فقط أتكهن ولكن إذا A::getV() لا يُرجع مرجعًا، فيمكنه شرح رسالة الخطأ "مكررات المتجهات غير متوافقة".

بالفعل A->getV().begin() و A->getV().end() سيكون اثنين من التكرارات على ناقلات مختلفة:كل A->getV() استدعاء إرجاع نسخة مختلفة من العضو الخاص.

نأمل أن يساعدك هذا في تصحيح مشكلتك.


يحرر:يبدو أنني توقعت ذلك بشكل صحيح:بعد تحرير سؤالك الذي يقدم التفاصيل، أستطيع أن أرى أنك تحدد

vector<vector<tile*> > getTiles();

ونتيجة لذلك، في البيان التالي:

for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);

كما هو متوقع أعلاه، كل مكالمة ل getTiles() سيعود نسخة مؤقتة منفصلة من ناقلات الأعضاء.ونتيجة لذلك عاد التكرارات من begin() و end() تأتي من ناقلات مختلفة، ومن هنا تأتي رسالة الخطأ التي تواجهها في وقت التشغيل.

وكذلك كما أشار تشارلز في إجابته التفصيلية, ، سيتم تدمير هذه النواقل المؤقتة بحلول الوقت الذي يصبح فيه الجسم الوظيفي for_each تم التوصل إليه.

فكر في إرجاع المتجه بواسطة مرجع ثابت مثل هذا:

const vector<vector<tile*> >& getTiles() const;

ويمكنك أيضًا أن تتغير drawTiles لتجنب المزيد من النسخ:

void drawTiles(const vector<tile*>& row)

نصائح أخرى

ما أفعله هو هذا:الطريقة المباشرة

vector<vector<int> > vvi;
vector<vector<int> >::iterator vvi_iterator;
vector<int>::iterator vi_iterator;

for(vvi_terator = vvi.begin();vvi_iterator!=vvi.end();++vvi_iterator) {
    for(vi_iterator = (*vvi_iterator).begin();vi_iterator!=(*vvi_iterator).end();++vi _iterator) {
     cout<<*vi_iterator<<" ";
    }  
}

هذه هي الفكرة القاسية.أجد طريقة for_each مرهقة لمجرد القيام بحلقة مزدوجة.يعد for_each مفيدًا عندما تريد إجراء بعض العمليات الحسابية على كل عنصر (مثل نوع من التعيين لكل عنصر)

لديك بعض الأخطاء الجسيمة، ولكن أولاً خطأ بسيط.

vector<vector<tile*>> getTiles();

حتى يخرج المعيار التالي، تحتاج إلى مسافة بين إلى >.

vector< vector<tile*> > getTiles();

ترجع هذه الدالة أ vector بالقيمة مما يعني أنه ينشئ نسخة جديدة من أي شيء vector يتم تمريره إلى بيان الإرجاع في الوظيفة.(أفترض أن إعلان الوظيفة هذا هو أي فئة curState هو مثال.)

عندما تفعل بعد ذلك:

for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);

سيُرجع كل استدعاء لـ getTiles نسخة مؤقتة منفصلة من المتجه.لا يعني هذا فقط أن التكرارات الخاصة بك من begin() و end() تأتي من نواقل مختلفة، ولكن سيتم تدمير النواقل بحلول الوقت الذي يكون فيه الجسم الدالة for_each تم التوصل إليه.

يبدو أنك بحاجة إلى البحث عن المراجع والتمرير حسب المراجع، لأنك تحتاج إلى فهمها قبل أن تتمكن من استخدامها بشكل صحيح std::for_each في هذه السيناريوهات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top