كيفية إنشاء كائنات متعددة في نفس الوظيفة ولكن من دون الكتابة بعضها البعض؟

StackOverflow https://stackoverflow.com/questions/609411

سؤال

وأنا أحاول أن إنشاء كائن في وظيفة، ولكن أنا على التوالي في المشكلة التي أسماء المتغيرات يجب أن تكون محددة في وقت التشغيل. هل هناك شيء يمكنني القيام به مثل مع المصفوفات التي تسمح شمال شرق لخلق ديناميكية متغير في وظيفة، ويفضل أن تعطيه اسما مختلفا عن الذي تم إنشاؤه عندما تم استدعاء الدالة آخر؟

و*** أنا أعمل في C ++

وتحرير: أنا لا يمكن أن تعطي أي رمز لأنني لم يكن لديك أي حق الآن. كل ما لدي الآن هو رمز زائف.

والأساس، وأنا أحاول أن إنشاء قائمة مرتبطة، إلا أن addNewItem () الطريقة التي أريد استخدام تتطلب استخدام نفس الأسلوب لإنشاء كائنات مختلفة.

وتحرير: من الناحية الفنية، ونحن لا يجعل LINKLIST، فقط أكثر من دليل على مفهوم لفهم كيفية عملها.

وتحرير: هنا هو رمز:

#include "linklist.h"
#include <iostream>
using namespace std;

struct linklist
{
    Student * obj;
    linklist * next;
};

linklist * head;

int main()
{

}
void addStudent(char * newsdnt)
{
    if(!head){
            linklist * a = new linklist;
            a->obj = new Student(newsdnt);
            a->next = 0;
            head = a;
            return;
    }else{
            linklist * a = new linklist;
            a->obj = new Student(newsdnt);
            a->next = 0;
            if(!head->next){
                    head->next = a;  // Can only have one or two items in list
            }
    }

و}

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

المحلول

إذا كنت ترغب في قائمة مرتبطة - دعوة جديدة لإنشاء كل عقدة جديدة ومن ثم إضافته إلى قائمة

وشىء من هذا القبيل:

void addStudent(char * newsdnt)
{
    linklist* a = new linklist;
    a.obj = new Student(newsdnt);
    a.next = 0;

    if( head == 0 ) {
        head = a;
    } else {
        linklist* whereToAdd = head;
        while( whereToAdd.next != 0 ) {
            whereToAdd = whereToAdd.next;
        }
        whereToAdd.next = a;
    }
}

نصائح أخرى

وأسهل وسيلة لبناء (منفردة) قائمة مرتبطة هو إضافة عنصر جديد في الجبهة:

linklist *head = 0;

...
a->next = head;
head = a;
...

إذا كان مقبولا لإضافة عناصر في الذيل في O (N) مرة، ثم لمسح قائمة كل الوقت للعثور على نهاية.

linklist head;

...
a->next = 0;
item = &head;
while (item->next != 0)
    item = item->next;
item->next = a;
...

إذا يجب إضافة بنود جديدة في ذيل القائمة في O (1) مرة، ثم تبقى قائمة دائرية، ومؤشر إلى ذيل القائمة (بحيث tail->next هو مؤشر إلى رأس القائمة ). (يمكن أن يسمى الهياكل القائمة السابقة 'فتح انتهت.)

linklist  root = { 0, &root };
linklist *tail = &root;

...
a->next = tail;
tail->next = a;
...

وحذار: شروط إنهاء لبالتكرار عبر قائمة كاملة (على سبيل المثال، للعثور على عنصر في القائمة) تختلف اعتمادا على بنية استخدامها (التعميم مقابل مفتوحة العضوية)

.

على التحذير : في! كود لم تختبر

إذا لم تكن متأكدا ما O (1) وO (N) يعني، ثم تقرأ على تدوين "بيغ O '.

وأود أن أقترح متجه:

#include <vector>
using namespace std;
void foo()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    cout << v[0] + v[1] << endl;
}

وعلى افتراض أن تحتاج الأجسام N من نوع T: صفائف هي موجودة كثيرا في C ++. ذلك هو STL الذي يوفر لك مجموعة من oppertunities. تحتاج إلى تعريف الطريقة التي سوف ترغب في الوصول واستخدام هذه الكائنات - التي تؤثر على اختيار الحاويات الخاصة بك. ولكن يمكنك إضافة بعض التعليمات البرمجية بحيث إجابات لدينا هي أقل قليلا غامضة (وأكثر فائدة لك)؟

ولست متأكدا بالضبط ما تريد ولكن يبدو أنك يمكن أن تستخدم مولتيست .

يرجى تقديم مزيد من التفاصيل، وأنا قد تكون قادرة على تقديم مزيد من المساعدة.

وبالنسبة للمبتدئين أود أن أقترح عليك إعادة تسمية البنية قائمة متصلة بك إلى عقدة وإضافة جديدة مرتبطة البنية القائمة التي تحمل الرأس، و (ربما) مؤشرات الحالي / الذيل. يجب عليك ثم تنفيذ طرق في هذه الفئة / البنية التي تسمح لك لمعالجته.

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

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