2009-04-02 23 views
23

Tôi đang cố gắng để xác định constructor và destructor của lớp học của tôi nhưng tôi tiếp tục nhận được lỗi:C++ biên dịch lỗi liên quan đến định nghĩa constructor/destructor

definition of implicitly-declared 'x::x()'

có nghĩa là gì?

Một phần của mã:

///Constructor 
StackInt::StackInt(){ 
    t = (-1); 
    stackArray = new int[20]; 
}; 

///Destructor 
StackInt::~StackInt(){ 
    delete[] stackArray; 
} 
+0

Các tệp của bạn được cấu trúc như thế nào (* .h, * .cpp)? Tệp được đăng trong mã nào? – paxdiablo

Trả lời

43

Trong khai báo lớp (có thể là trong một tập tin header), bạn cần phải có cái gì đó trông giống như:

class StackInt { 
public: 
    StackInt(); 
    ~StackInt(); 
} 

Để cho trình biên dịch biết bạn don không muốn các phiên bản được tạo bởi trình biên dịch mặc định (vì bạn đang cung cấp chúng).

Có thể sẽ có nhiều tuyên bố hơn thế, nhưng bạn sẽ cần ít nhất những điều đó - và điều này sẽ giúp bạn bắt đầu.

Bạn có thể thấy điều này bằng cách sử dụng rất đơn giản:

class X { 
     public: X(); // <- remove this. 
}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

Biên dịch đó và nó hoạt động. Sau đó, xóa dòng có dấu nhận xét và biên dịch lại. Bạn sẽ thấy vấn đề của mình xuất hiện sau đó:

class X {}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

 
qq.cpp:2: error: definition of implicitly-declared `X::X()' 

+0

Cảm ơn bạn. Đây chính là vấn đề. –

+0

@MB, tôi đã làm việc trên một thử nghiệm prog trong khi bạn trả lời vì vậy tôi nghĩ rằng tôi muốn thêm nó hơn là làm cho một câu trả lời cạnh tranh mà nói cùng một điều. Sau đó, tôi upvoted câu trả lời của bạn tốt hơn nhiều :-) – paxdiablo

+0

Ngắn gọn và chính xác ... rất tốt thực hiện. – ojblass

1

Một điều cần lưu ý là tất cả những gì các nhà xây dựng truy cập phải được công khai. Tôi đã nhận được lỗi này trước đây.

class X{ 
    T *data; 
public:  // <-move this to include T * 
    X(); 
    ~X(); 
} 

Mã này vẫn có lỗi bởi vì trong constructor của tôi, tôi đã có những điều sau đây:

X::X(){data = new T(); 

Điều này có nghĩa rằng mặc dù tôi đã thực hiện các constructor và destructor công cộng, các dữ liệu mà họ đang làm việc với vẫn còn riêng tư, và tôi vẫn có lỗi "định nghĩa ngầm được khai báo".

+1

Điều này không chính xác chút nào. Các nhà xây dựng có thể truy cập bất kỳ biến thành viên tư nhân, và để làm như vậy thường là nhiều công việc của nó. –

+0

Có, hàm tạo có thể truy cập bất kỳ biến thành viên riêng nào, nhưng chỉ ** của lớp riêng của nó. ** Điều này có nghĩa là nếu constuctor của bạn muốn truy cập các biến riêng tư của dữ liệu T * thì nó sẽ được công khai. – taronish4

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