2013-10-27 16 views
6

Tôi rất mới với C++ vì vậy tha thứ cho tôi nếu tôi đã bỏ qua một cái gì đó đơn giản. Tôi có một Vòng kết nối lớp học:C++ mặc định Constructor không được gọi là

class Circle: public Shape{ 
protected: 
    //string name; 
    Point focus; 
    float radius; 
private: 

public: 
    virtual void calculateArea(); 
    virtual void calculatePerimeter(); 
    Circle(); 
    Circle(Point p, float r); 

};

Tôi có hai nhà thầu, một trong số đó là mặc định mà tôi đã quá tải:

Circle::Circle() 
{ 
    Point p(1,1); 
    focus = p; 
    radius = 10; 
    name = "Circle"; 
    calculatePerimeter(); 
    calculateArea(); 
    cout<<"default circle"<<endl; 
} 
Circle::Circle(Point p, float r) 
{ 
    focus = p; 
    radius = r; 
    name = "Circle"; 
    calculatePerimeter(); 
    calculateArea(); 
} 

Trong chính tôi, tôi cố gắng tạo ra hai vòng tròn một cách sử dụng mỗi nhà xây dựng, tuy nhiên Circle được tạo ra với Circle () không bao giờ được tạo. Tôi không thể cho cuộc sống của tôi tìm ra lý do tại sao? Không có thông báo lỗi hoặc bất cứ điều gì.

int main{ 
    Circle circle(a, 3.3); 
    Circle c2(); 
} 

Trả lời

21
Circle c2(); 

Không tạo ra một đối tượng, nó tuyên bố một chức năng theo tên c2 mà mất không đối số và trả về một đối tượng Circle. Nếu bạn muốn tạo một đối tượng chỉ cần sử dụng:

Circle c2; 
+1

Điều đó hoạt động hoàn hảo, cảm ơn. Tôi có thể cuối cùng đã nhận thấy rằng nếu nó không phải là 3 giờ sáng. Tôi nghĩ rằng thời gian nghỉ của nó bây giờ. – MichelleJS

+1

Hoặc tốt hơn: 'Circle c2 {}' là khởi tạo giá trị và 'Circle c2;' là khởi tạo mặc định. – Nawaz

+5

Oh BTW, đó không phải là hầu hết * phân tích cú pháp vexing. Nó chỉ là * vexing * phân tích cú pháp. 'Type1 a (Type2());' là * hầu hết * phân tích cú pháp vexing. – Nawaz

6

này ở đây không phải là một instantiation, nhưng phần khai báo hàm:

// parameter-less function c2, returns a Circle. 
Circle c2(); 

Bạn cần

Circle c2; 

hoặc

Circle c2{}; // requires c++11 
Các vấn đề liên quan