3

我正在尝试编写类似 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 或者初始化它,我只是不喜欢并且如果不给匿名类型一个名字就不能这样做。

4

2 回答 2

1

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

#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,因此无法从课程外访问课程本身。请参阅更新的代码。

于 2012-04-15T17:26:01.700 回答
1

您收到此错误是因为您必须在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();
}
于 2017-08-01T13:55:10.760 回答