2017-01-25 4 views
0

Я хочу знать, правильно ли это или есть ли способ хранения разных объектов одного класса и использования операций класса?, используя список для хранения объектов

class Camera_ { 

//function1 
//function2 
//function3 

} 

int main() 
{ 
    int n ; 
    std::cout <<"\n How many Cameras you are using ? \n"; 
    std ::cin >> n; 
    std:: cout << "The number of camera is " << n << std ::endl ; 

    std::list<Camera_> list1; // creating a list of camera 



    for(int j=0; j<n; j++) //transfer array 
    camera = new Camera_;// camera object   
    list1.push_back(camera);// storing camera objects 
    list<Camera_>::iterator it; 
    for(it = iList.begin(); it != iList.end(); it++) 
    *it->function1(); 
    *it->function2(); 
    *it->function3(); // I am trying to access 3 function of the class for each objects of camera class. 

    return 0; 
} 
+1

Для вашей потребности это может быть эффективно, если вы используете 'std :: vector' вместо' std :: list' – Steephen

+0

Я не нашел подходящего примера для использования std :: vector для хранения разных объектов того же класса и выполнения работа на нем, можете ли вы дать мне хорошие ресурсы, я попробовал найти ответы на другие вопросы здесь, спасибо за ответ. – Angelina

+1

Не используйте список указателей «Камера». Вы можете просто использовать список (или вектор, если вы не планируете добавлять или удалять из середины списка часто) объектов «Камера», т. Е. 'Std :: list '. –

ответ

0

То, что вы показали, не соответствует действительности. Это должно выглядеть примерно так:

class Camera { 
public: 
    void function1() { 
     // ... 
    } 
    void function2() { 
     // ... 
    } 
    void function3() { 
     // ... 
    } 
}; 

int main() 
{ 
    int n; 
    std::cout << "How many Cameras you are using? "; 
    std::cin >> n; 
    std::cout << "The number of Cameras is " << n << std ::endl; 

    std::list<Camera> list1; // creating a list of camera 

    for (int j = 0; j < n; ++j) { 
     list1.push_back(Camera()); // storing camera objects 
     // or, if using C++11 or later: 
     // list1.emplace_back(); 
    } 
    // or simply: 
    // list1.resize(n); 

    list<Camera>::iterator it; 
    for(it = list1.begin(); it != list1.end(); ++it) { 
     it->function1(); 
     it->function2(); 
     it->function3(); 
    } 

    return 0; 
} 
+0

Спасибо, я понял сейчас. Но эта строка должна быть такой, как this1.push_back (Camera); почему вы используете Camera(); – Angelina

+1

@FarialSamia: 'Camera()' явно вызывает конструктор. На C++ 11 это создаст объект temp, переместит его в новый объект в 'list', а затем уничтожит (теперь бесполезный) temp-объект. Использование 'emplace_back' позволяет избежать необходимости фактически повторять имя класса и непосредственно конструировать в' list', избегая любой посторонней конструкции/разрушения. – ShadowRanger

0

Here'r некоторые предложения, которые могут улучшить эффективность и другие вещи:

  1. Если вы не делаете частые вставки в конкретных индексов, использование вектора вместо список, вы получите случайные acces (Это зависит от вас usecase).

  2. Использование смарт-указатель - вы сохраняете указатель класса Camera_

    камера = новая камера _; // объект камера
    list1.push_back (камера); // хранение камеры объекты

Измените это на:

shared_ptr<Camera_> sptr = make_shared(new Camera_); 
list1.push_back(sptr);// storing camera objects 

Лучше использовать интеллектуальные указатели, поскольку вы избегаете бремени удаления память. Использование raw-указателя может привести к утечке памяти даже после надлежащего ухода (например, во время исключений).

+0

@ instace, спасибо за ваше решение. Если я использую общий указатель, нужно ли использовать пользовательский delete для общего указателя? Другое дело, в чем преимущество использования вектора здесь, можете ли вы привести любой пример этого, используя вектор. – Angelina

+0

Если вы используете интеллектуальные указатели, вам не нужно специально удалять их, поскольку они являются указателями на основе ссылок, они будут удалены автоматически, как только счетчик ссылок будет равен нулю. Во-вторых, выбор контейнера зависит от вашего будущего использования, такого как частые вставки/удаления/поиск. Сделай мудрый выбор, учитывая свои возможности. – instance