所以通常我遵循将公共(public)成员函数放在私有(private)属性之前的惯例,例如
class SomeClass {
public:
void amazingMethod();
private:
int fantasticAttribute;
};
因为用户(包括我)希望在类里面首先看到的是我可以使用的东西。然而,我最近的一个项目引入了一些真正的奇怪之处。
template<typename T>
class LinkedList {
public:
class LinkedListIterator {
public:
LinkedListIterator(Node* node) : node(node) {}
LinkedListIterator& operator++() {
if (node != nullptr) {
node = node->next;
}
}
private:
Node* node;
};
LinkedListIterator begin() {
return LinkedListIterator(head);
}
private:
struct Node {
Node* next;
};
Node* head;
};
此代码在 Visual Studio 2015 中无法编译,报告当 LinkedListIterator
尝试使用它时,Node
未定义。但奇怪的是,如果我翻转 LinkedList
,那么它的声明如下
template <typename T>
class LinkedList {
private:
//everything that was in private before
public:
//everything that was in public before
};
一切都正确编译!这只是 Visual Studio 的一个怪癖吗?我猜这与它是一个模板类有关,但我不知道。
我怎么知道什么时候我必须泪流满面地放弃首先宣布公共(public)成员(正如大多数大会所建议的那样)?什么时候它不再只是一种风格选择?
最佳答案
与访问类型无关。它与 LinkListIterator
尝试使用编译器尚未见过的类型有关。
但是,由于迭代器类仅使用指向 Node 类型的指针,因此前向声明就足够了。下面的代码添加了前向声明并编译得很好:
template<typename T>
class LinkedList {
private:
struct Node; // Private forward declaration of the private class
public:
class LinkedListIterator {
public:
LinkedListIterator(Node* node) : node(node) {}
LinkedListIterator& operator++() {
if (node != nullptr) {
node = node->next;
}
}
private:
Node* node;
};
LinkedListIterator begin() {
return LinkedListIterator(head);
}
private:
struct Node {
Node* next;
};
Node* head;
};
int main()
{
return 0;
}
关于c++ - 什么时候公共(public)/私有(private)的排序不是一种风格选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35544326/