2017-01-25 5 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 :: list'の代わりに' std :: vector'を使用すると効率的かもしれません。 – Steephen

+0

私はstd :: vectorを使って同じクラスの異なるオブジェクトを格納するための適切な例を見つけられませんあなたは私に良いリソースを与えてください、私はここで別の質問の答えを探してみました、それに答えるために感謝します。 – Angelina

+1

'カメラ'ポインタのリストを使用しないでください。 'Camera'オブジェクト、つまり' 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

ありがとう、私は今理解しています。しかし、この行はこのlist1.push_back(Camera)のようにする必要があります。なぜCamera()を使用しているのですか? – Angelina

+1

@FarialSamia: 'Camera()'は、明示的にコンストラクタを呼び出しています。 C++ 11では、これは一時オブジェクトを作成し、それを 'list'内の新しいオブジェクトに移動し、(現在は役に立たない)一時オブジェクトを破棄します。 'emplace_back'を使うと、実際にクラスの名前を繰り返す必要がなくなり、無関係の構築/破壊を避けて' list'に直接組み立てられます。 – ShadowRanger

0

Here'r効率や他のものを改善することがいくつかの提案を::

  1. あなたが特定のインデックスで頻繁に挿入を行っていない場合は、代わりのベクトルを使用することは、このような、よりになりますリスト、あなたはランダムアクセスを取得します(これはあなたに依存します)。

  2. 使用スマートポインタ - あなたは

    カメラ=新しいカメラ_ Camera_クラスのポインタを格納している; //カメラオブジェクト
    list1.push_back(カメラ); //カメラを格納する

オブジェクトそれを次のように変更してください:

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

スマートポインタを使用することをお勧めします。メモリ。生ポインタを使用すると、適切な注意を払った後でも(例外の場合など)時にはメモリリークが発生することがあります。

+0

@instace、あなたのソリューションに感謝します。共有ポインタを使用する場合は、共有ポインタにカスタム削除を使用する必要がありますか?もう一つは、ここでベクトルを使用する利点は何ですか、ベクトルを使用してこれを行う例を与えることができます。 – Angelina

+0

スマートポインタを使用している場合は、参照ベースのポインタであるため、スマートポインタを特別に削除する必要はありません。参照カウントがゼロになるとすぐに自動的に削除されます。第2に、コンテナの選択は、頻繁な挿入/削除/検索など、将来の使用に依存します。あなたのユースケースを考慮して賢明な選択をしてください。 – instance

関連する問題