将非静态数据成员与常量成员

时间:2017-10-14 07:18:33

标签: c++ c++11

以下是代码,我希望将非静态数据成员check与类中定义的常量数据成员NULL_NODE进行比较。

为什么无法比较? 建议的方法是如何获得代码中描述的is_null功能并使NULL_NODE成为不可修改的实体?

class test {
public:
    struct st {
        int check;
        bool is_null() const { return NULL_NODE == check; }
    };

private:
    const int NULL_NODE{-1};

};


int main() {
    return 0;
}

使用以下命令编译代码: g++ -std=c++11 test.cpp

报告异常:

test.cpp: In member function ‘bool test::st::is_null() const’:
test.cpp:8:39: error: invalid use of non-static data member ‘test::NULL_NODE’
         bool is_null() const { return NULL_NODE == check; }
                                       ^
test.cpp:12:27: note: declared here
     const int NULL_NODE{-1};

2 个答案:

答案 0 :(得分:2)

为什么要在non-static内引用struct st变量?这是不可能的,因为您永远不会知道应该引用哪个test实例。

换句话说,内部结构没有引用周围的类 - 要比较,在Java内部类中确实有引用,除非内部类被声明为static

请注意以下代码的编译方式:

int main() {
    test::st x; /* instance of your struct, without any reference to "test" class" */
    return 0;
}

因此,您需要将NULL_NODE声明为static const

答案 1 :(得分:0)

NULL_NODE是常量,但它不是静态的,即每个测试'实例将有自己的副本,因此一个' st'实例无法知道引用哪一个;解决方案是使其静止。

在pre-c ++ 17中,您还应该在某个翻译单元中定义它(除非使用非ODR)(或使用静态内联成员函数);从c ++ 17开始,我们有内联变量,因此您只需将其定义为' static constexpr' (constexpr成员自动内联和常量)。