c++ - 什么时候公共(public)/私有(private)的排序不是一种风格选择?

标签 c++ visual-studio visibility declaration inner-classes

所以通常我遵循将公共(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;
}

Live Example

关于c++ - 什么时候公共(public)/私有(private)的排序不是一种风格选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35544326/

相关文章:

Magento - 按可见性过滤类别

java - 您将如何以彩色方式运行外部 JFrames?

c++ - 在类中初始化可变长度的 C 字符串

c++ - 如何安全地将包含的对象(菜单项)与需要容器(菜单)的 API 同步?

c++ - 如何在 visual studio 中链接 dll?

c++ - 在 Visual Studio 2010 中的 "break all"之后,我的 C++ 程序中大部分线程的调用堆栈丢失

Java 并发性 -_- 在线程之间共享变量时的可见性/重新排序

c++ - 将 2D 位图转换为 3D 立方体模型的有效方法?

c++ - 模板类库

visual-studio - 为任何 IP 地址保留 netsh http url 的语法