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

时间:2012-04-15 16:41:56

标签: c++

我正在尝试编写类似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或者初始化它我不喜欢并且不能在不给出匿名类型的情况下执行它一个名字。

2 个答案:

答案 0 :(得分:0)

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

#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#-like”,它只是不起作用。而且我看不出static如何与C#property混合。

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

答案 1 :(得分:0)

您收到此错误是因为您必须在某处定义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();
}