2013-02-27 81 views
6

Làm cách nào để khởi tạo một std :: vector trong một hàm tạo lớp trong C++?Làm cách nào để khởi tạo một std :: vector trong một hàm tạo lớp trong C++?

class MyClass 
{ 
public: 
    MyClass(int p_Var1, int* p_Vector) : Var1(p_Var1) //, Initialize std::vector - MyVector with p_Vector 
    { 
    }; 
    ~MyClass(void); 
private: 
    int Var1; 
    std::vector<int> MyVector; 
}; 
+0

Tôi muốn khởi tạo 'std :: vector' của bạn theo cách nào? (Hình thức cụ thể của các nhà thầu của nó bạn muốn sử dụng?) –

+1

Nó phụ thuộc. Ý bạn là gì khi "khởi tạo"? Đối với phiên bản tiêu chuẩn C++ nào bạn đang làm việc? – Johnsyweb

+0

@Mark Garcia với int * p_Vector – CLearner

Trả lời

10

Thứ nhất, myVector sẽ được khởi tạo, ngay cả khi bạn không làm gì cả, vì nó có nhà xây dựng không tầm thường. Nếu bạn muốn khởi tạo nó, hãy đưa con trỏ đến một chuỗi int, bạn sẽ cũng phải biết độ dài. Nếu bạn có cả một con trỏ và chiều dài, bạn có thể làm:

: myVector(pInitialValues, pInitialValues + length) 

Ngoài ra (và idiomatically hơn), bạn sẽ cho người gọi làm việc bổ sung, và có các nhà xây dựng mất hai con trỏ, một bắt đầu và kết thúc: (. Nếu người gọi là sử dụng C++ 11, ông có thể có được những từ một mảng C phong cách sử dụng std::begin()std::end())

: myVector(pBegin, pEnd) 

EDIT:

Chỉ cần làm cho nó hoàn toàn rõ ràng: chỉ cần một int* không cung cấp đủ thông tin để làm bất cứ điều gì . An int* trỏ đến thành phần đầu tiên của một mảng kiểu C ; bạn cũng cần một số cách để kết thúc: số phần tử, con trỏ kết thúc, v.v. Trong các trường hợp đặc biệt, có thể sử dụng các kỹ thuật khác; ví dụ: nếu kiểu C kiểu C chỉ chứa các số không âm, bạn có thể sử dụng -1 làm một tình trạng và một cái gì đó như : myVector(pVector, std::find( pVector, NULL, -1)). Đây là những trường hợp đặc biệt, tuy nhiên.

+1

* vì nó có các nhà xây dựng không tầm thường *? Không nên là * vì nó có hàm tạo mặc định *? Và có một nhà xây dựng bản sao :) –

+0

@ BЈовић Không chắc chắn chính xác những gì nên có. Chính thức, nó là một hàm tạo non-tầm thường có thể được gọi với các đối số đã cho (hoặc một hàm tạo mặc định không tầm thường, nếu không có khởi tạo được xác định). Thực tế, tuy nhiên, có các nhà xây dựng không tầm thường mà _don't_ khởi tạo các thành viên dữ liệu, bao gồm cả các trình biên dịch được tạo ra (ví dụ: nếu lớp đó có các hàm ảo). Vì vậy, trong khi tiêu chuẩn có thể xem xét các thành viên "khởi tạo", nó sẽ không được khởi tạo bởi bất kỳ ý nghĩa hợp lý của từ. (Nhưng 'vectơ' có một ctor do người dùng định nghĩa làm điều đúng.) –

Các vấn đề liên quan