Tôi đang cố gắng triển khai cấu trúc giống cây với hai lớp: Cây và Nút. Vấn đề là từ mỗi lớp tôi muốn gọi một hàm của lớp khác, vì vậy khai báo đơn giản về phía trước là không đủ. Chúng ta hãy xem một ví dụ:phụ thuộc cyclic giữa các tệp tiêu đề
Tree.h:
#ifndef TREE_20100118
#define TREE_20100118
#include <vector>
#include "Node.h"
class Tree
{
int counter_;
std::vector<Node> nodes_;
public:
Tree() : counter_(0) {}
void start() {
for (int i=0; i<3; ++i) {
Node node(this, i);
this->nodes_.push_back(node);
}
nodes_[0].hi(); // calling a function of Node
}
void incCnt() {
++counter_;
}
void decCnt() {
--counter_;
}
};
#endif /* TREE_20100118 */
Node.h:
#ifndef NODE_20100118
#define NODE_20100118
#include <iostream>
//#include "Tree.h"
class Tree; // compile error without this
class Node
{
Tree * tree_;
int id_;
public:
Node(Tree * tree, int id) : tree_(tree), id_(id)
{
// tree_->incCnt(); // trying to call a function of Tree
}
~Node() {
// tree_->decCnt(); // problem here and in the constructor
}
void hi() {
std::cout << "hi (" << id_ << ")" << endl;
}
};
#endif /* NODE_20100118 */
Calling Tree:
#include "Tree.h"
...
Tree t;
t.start();
Đây chỉ là một ví dụ đơn giản để minh họa vấn đề. Vì vậy, những gì tôi muốn là gọi một chức năng của cây từ một đối tượng Node.
Cập nhật # 1: Cảm ơn câu trả lời. Tôi đã cố gắng giải quyết vấn đề như trong Java, tức là chỉ sử dụng một tệp cho mỗi lớp. Có vẻ như tôi sẽ phải bắt đầu tách các tệp .cpp và .h ...
Cập nhật # 2: Dưới đây, làm theo các gợi ý, tôi cũng đã dán giải pháp hoàn chỉnh. Cảm ơn, đã giải quyết được sự cố.