2011-06-22 36 views
12

Vấn đề của tôi:khai báo chuyển tiếp và không gian tên (C++)

Có hai lớp, loại A và B, vì vậy tôi có A.h và A.cpp và B.h và B.cpp. A cần biết B và B cần biết A. Tôi giải quyết nó theo cách sau (tôi không biết tại sao nó có để được như vậy ...)

Ah:

#include "B.h" 
class A{ ... 

A. cpp:

#include "A.h" 

Bh:

#include "A.h" 
class A; // forward declaration 
class B { ... 

B.cpp:

#include "B.h" 

Tôi đã sử dụng một tuyên bố chuyển tiếp và nó hoạt động.

Vấn đề là cả hai lớp phải nằm trong vùng tên "ui". Hoặc ít nhất tôi nghĩ rằng đây là ý nghĩa:

A.h:

#include "B.h" 
namespace ui{ 
    class A; 
} 

class A{ ... 

B.h:

#include "A.h" 
namespace ui{ 
    class B; 
} 

class B{ ... 

này không hoạt động nữa. Tôi phải làm gì bây giờ để làm cho nó hoạt động trở lại với khai báo không gian tên và chuyển tiếp?

Cả hai phải nằm trong không gian tên này. Tôi đang làm việc với Qt và các dòng "namespace ui {" vv là cần thiết. Và cả hai lớp đều cần phải biết nhau. Tôi đã cố gắng chỉ để làm cho điều này:

namespace ui{ 
class A; 
class B; 
} 

trong cả tiêu đề, nhưng điều này không làm việc ...

Btw: Tất cả Tiêu đề-Files cũng có những "ifndef" -mechanism.

+3

"Điều này không có tác dụng nữa" nghĩa là gì? Vui lòng đăng lỗi chính xác/trình liên kết. – fredoverflow

Trả lời

6
// A.h 
namespace ui { 
    class A; // forward 
    class B { 
    }; 
} 



// B.h 
namespace ui { 
    class B; // forward 
    class A { 
    }; 
} 



// A.cpp 
#include "A.h" 
#include "B.h" 



// B.cpp 
#include "A.h" 
#include "B.h" 
3

Bạn sắp hoàn tất. Điều này sẽ làm việc:

// A.h 
namespace ui { 

class B; 
class A { 
    ... 
}; 

} // namespace ui 

// B.h 
namespace ui { 

class A; 
class B { 
    ... 
}; 

} // namespace ui 

Điều duy nhất bạn có sai là bạn phải xác định các lớp bên trong namespace; nó không đủ để chuyển tiếp khai báo chúng bên trong không gian tên.

+0

Tôi không thể làm điều này. Đây là văn bản được tạo tự động bởi QT- Nó chỉ làm điều này.Tôi không biết tại sao Btw cũng trong ví dụ đầu tiên của tôi mà tôi tuyên bố là làm việc tôi cũng cần hai tờ khai về phía trước – Obs

+0

Bạn có thể nhận thấy rằng bạn có ba câu trả lời tất cả nói gần như chính xác cùng một điều? Nếu QT-Designer không thể thuyết phục để đưa các định nghĩa lớp của nó vào bên trong khối "' namespace ui {'...'} ', thì bạn bị mắc kẹt với các lớp đó trong không gian tên chung. – zwol

13

Nếu tôi hiểu bạn đúng, bạn khai báo 2 loại khác nhau với một cấu trúc như:

#include "B.h" 
namespace ui{ 
    class A; 
} 

class A{ ... }; 

Ở đây bạn nêu rằng có một class A trong không gian tên ui, nhưng bạn định nghĩa một class A trong không gian tên toàn cầu. Do đó, ui::A được khai báo nhưng chưa bao giờ được xác định là.Di chuyển định nghĩa của A đến namespace ui cũng như:

#include "B.h" 
namespace ui{ 
    class A; 
} 

//somewhere later: 
namespace ui 
{ 
    class A{ ... }; 
} 
0

Đây là một câu hỏi rất Qt cụ thể.

Khi Qt Designer tự động tạo tệp mã cho bạn, không gian tên Ui là một không gian tên riêng biệt từ các lớp của bạn. Thực tế có hai lớp khác nhau được khai báo ở đây: class A trong không gian tên chung và class Ui::A trong không gian tên Ui. Lớp thứ hai chứa tất cả các điều khiển mà Qt tạo cho bạn (khi bạn sử dụng trình thiết kế biểu mẫu), và lớp đầu tiên (trong không gian tên chung) có tất cả logic của bạn.

Các phiên bản của Qt Creator Tôi đang sử dụng (3.1) cũng sẽ tạo ra một thành viên tư nhân cho class A (không Ui::A): private: Ui::A* ui;, đó là thiết lập với ui->setUp(this). Sau đó, bạn có thể truy cập các điều khiển (ví dụ: ui->lineEdit->toPlainText();.

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