C++静态匿名类类型数据成员

C++ static anonymous class type data member

本文关键字:类型 数据成员 静态 C++      更新时间:2023-10-16

我正在尝试编写像属性一样的 C#,所以我得到了这个:

#include <iostream>
class Timer
{
public:
    static class {
    public:
        operator int(){ return x;}
    private:
        int x;
    }y;
};
int main()
{
    std::cout << Timer::y;
    std::cin.get();
}

最后我得到了这个错误:

error LNK2001: unresolved external symbol 
"public: static class Timer::<unnamed-type-y>y> Timer::y"

如果有人告诉我原因,我将不胜感激。

所以这只是一个声明,太糟糕了,我是否可以得到一些方法来使其成为定义,而不是在其他地方定义 y 或初始化它,我只是不喜欢它,如果不给匿名类型一个名字就无法做到这一点。

我能想到的最简单的解决方案(尽管它为您的未命名类引入了名称):

#include <iostream>
class Timer
{
private:
    class internal {
    public:
        operator int(){ return x;}
    private:
        int x;
    };
public:
    static internal y;
};
Timer::internal Timer::y;
int main()
{
    std::cout << Timer::y;
    std::cin.get();
}

另外,不要试图用C++编写任何"类似 C#"的东西,它只是不起作用。而且我不明白static如何与 C# property 混合.

编辑:您甚至可以将internal类标记为private,因此无法从类外部访问该类本身。请参阅更新的代码。

您收到此错误是因为您必须在某处定义y,但您只是在类定义中声明了它。声明它可能很棘手,因为它没有任何命名类型,并且您必须在声明它时指定类型。但是对于 C++11,您可以使用decltype来执行此操作:

#include <iostream>
class Timer{
public:
    static class {
    public:
        operator int(){ return x;}
    private:
        int x;
    } y;
};
decltype(Timer::y) Timer::y;    //You define y here
int main(){
    std::cout << Timer::y;
    std::cin.get();
}