2012-04-15 21 views
2

Ich versuche, C# wie Eigentum zu schreiben, so dass ich diese:C++ statisches anonyme Klasse Typ Daten Mitglied

#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(); 
} 

Und schließlich habe ich diesen Fehler:

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

würde ich schätzen werden wenn mir jemand sagt warum.

Also ist es nur eine Deklaration, das ist schade, kann ich einen Weg finden, es zu einer Definition anders als definieren y woanders zu machen oder es zu initialisieren, was ich einfach nicht mag und es nicht tun kann, ohne anonym zu geben Geben Sie einen Namen ein.

+1

Sie müssen definieren (nicht nur zu deklarieren) y irgendwo. –

+0

http://stackoverflow.com/questions/195207/unresolved-external-symbol-on-static-class-members –

Antwort

0

Die einfachste Lösung, die ich mir vorstellen kann (obwohl es Namen für die unbenannte Klasse einführt):

#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(); 
} 

Versuchen Sie auch, nicht alles „C# -ähnliche“ in C++ zu schreiben, es doesn nur‘ t arbeiten. Und ich sehe nicht, wie static mit C mischen # property.

Edit: Sie können sogar die internal Klasse als private markieren, so dass die Klasse selbst von außerhalb der Klasse nicht zugänglich sein wird. Siehe aktualisierten Code.

+1

@Mike, nun, Proxy-Objekte sind in Ordnung, aber Sie können diese Klasse leicht benennen. Unbenannte Typen sind böse (tm). – Griwes

0

Sie erhalten diesen Fehler, weil Sie irgendwo y definieren müssen, aber Sie haben es gerade in der Klassendefinition deklariert. Es zu deklarieren kann schwierig sein, da es keinen benannten Typ hat, und Sie müssen den Typ bei der Deklaration angeben. Aber mit C++ 11 können Sie decltype verwenden, um dies zu tun:

#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(); 
} 
Verwandte Themen