2012-11-23 12 views
5

Tôi đã đọc về giải pháp const A a[3] = { {0,0}, {1,1}, {2,2} }, nhưng trong chương trình của tôi const không thể được sử dụng:Làm thế nào tôi có thể tạo một mảng các đối tượng lớp có hàm tạo yêu cầu vài đối số?

class Paper: public PaperQueue{ 
    ... 
    protected: 
    typedef int (Utils::*funcPtr) (int, int); //I use external function there 
    funcPtr p;        
    Utils* fptr; 
    public: 
    int pricefunc(){  
     addprice = (fptr->*p) (t,price); 
    } 

    Paper(int n, unsigned int pr):PaperQueue(n){   
     ... 
     p=&Utils::commonpricefunc;  
    } 
    void Put(int a){ 
     ... 
    } 
    ... 
}  

class Bank{ 
    ... 
    void Buy(Paper &p){ 
    (/*this function modifies many parameters in 'p'*/) 
    ... 
    } 
    ... 
} 

int main(){ 
Bank B;  
int pn=5; 
/* ? */ const Paper p[pn] = {{5,15},{5,15},{5,15},{5,15},{5,15}}; /* ? */ 
int paperloop=0; 
... 
p[paperloop].Put(p[paperloop].addprice); 
B.Buy(p[paperloop]); 
... 

Điều đó mang lại cho tôi rất nhiều lỗi (với pricefunc(), Đặt(), Mua(), .. .), hoặc chỉ "đối tượng có kích thước biến 'p' có thể không được khởi tạo". Có cách nào để làm cho mảng này hoạt động không? (Tất cả mọi thứ hoạt động tốt nếu không muốn nói để vượt qua bất kỳ thông số để xây dựng!)

+0

'** const Giấy p [pn]'? – iammilind

+0

Tôi cần phải tạo một mảng, một cái gì đó như 'Giấy (p [pn]) (5,25)' hoặc một cái gì đó ... Mỗi nhà xây dựng nên nhận các tham số này và 'p [i]' không nên là đối tượng chỉ đọc . – Slowpoke

+0

Đó chỉ là thẻ đậm bên trong mã. – Slowpoke

Trả lời

2

Bạn không thể sử dụng danh sách khởi tạo cho các lớp học (không -PODs) vì điều đó sẽ bỏ qua cuộc gọi đến hàm tạo. Bạn sẽ phải thay đổi nó thành POD hoặc sử dụng std :: vector theo các cách sau:

Nếu lớp này có thể sao chép được, có vẻ như bạn có thể tạo std :: vector và điền nó bằng giá trị bạn muốn:

const vector<Paper> papers(5, Paper(5, 15)); 

Nếu bạn muốn khởi tạo nó với các giá trị khác nhau, bạn có thể sử dụng một danh sách initializer, nhưng điều này chỉ được hỗ trợ trong C++ 11:

const vector<Paper> papers = {Paper(1, 1), Paper(2, 2)}; 

Without C++ 11, bạn sẽ phải thêm từng phần tử một, nhưng sau đó bạn không thể tạo thành vectơ:

vector<Paper> papers; 
papers.push_back(Paper(1, 1)); 
papers.push_back(Paper(2, 2)); 
+0

Cảm ơn bạn! 'int pn = 5; vector p (pn, Paper (5, 15)); 'đã làm. Ít nhất là một cái gì đó. – Slowpoke

0

Vui lòng kiểm tra mã dưới đây, nó có thể được biên dịch:

class Paper{ 

công cộng:

int x; 
int y; 

};

int main() {

Paper p[5] = {{5,15},{5,15},{5,15},{5,15},{5,15}}; 

}

Vui lòng tham khảo this post để biết thêm chi tiết, tôi nghĩ rằng nó giải thích rất tốt

+0

Mã tuân thủ tốt trên g ++ 4.6.3, nhưng trong chương trình của tôi {5,15} là các tham số mà tôi cố gắng chuyển cho hàm tạo. – Slowpoke

+0

Ok, cảm ơn bạn! Khi tôi viết p [5] nó dường như làm việc với cảnh báo 'cảnh báo: mở rộng danh sách initializer chỉ có sẵn với -std = C++ 0x hoặc -std = gnu ++ 0x' – Slowpoke

+0

Có khả năng nào để làm cho nó đẹp hơn? Tôi muốn có một cái gì đó như p [n] ... – Slowpoke