Signatur von öffentlichen member enthält native Art
Ich bin neu in visual c++, ich habe den folgenden code:
ref class Book sealed
{
public:
Book(std::string title,std::string author,int year);
void setTitle(std::string title);
std::string getTitle() const;
int getYear() const;
void setYear(int year);
void setAuthor(std::string author_);
std::string getAuthor() const;
private:
std::string title_;
std::string author_;
int year_;
};
Wenn ich versuche zu kompilieren bekomme ich den folgenden Fehler:
{ctor} signature of public member contains native type
. Ich vermute, das ist weil ich verwende einen std::string und nicht die Platform::String, wie kann ich das beheben?
- Das sieht nicht aus wie C++. Ich glaube, Sie brauchen eine andere Sprache-tag.
- Das ist managed C++, nicht C++
- sorry, mein Fehler.
- Es ist C++/CLI, Microsofts Adaption von C++ für das .NET-Plattform. Es ist nicht standard-C++.
- Nein, es dies zulässt. Das ist C++/CX, eine Sprache, die Erweiterung, die es erlaubt Sprachen wie VB.NET und Javascript, um den direkten Aufruf von C++ - code. Was natürlich nicht funktionieren kann mit std::string, Javascript kennt Bohnen über, die C++ - Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre ref-Klasse ist nicht als öffentlich gekennzeichnet sich, so scheint es, Sie sind nur verbrauchen diese Klasse intern (als Quelle) aus anderen C++, und nicht die Absicht, für Sie veröffentlicht werden, um anderen WinRT Verbraucher.
Wenn dies der Fall ist, können Sie Ihren Konstruktor als
internal
stattpublic
, die öffentlichkeit innerhalb dieser Komponente und von außen nicht sichtbar. Und wirklich, wenn das ist Ihre bestimmungsgemäße Verwendung, dann kann es nur sein, eine regelmäßige 'Klasse' statt ein 'ref' Klasse'. Wenn Sie möchten, es zu benutzen über die WinRT-Grenze, aber Sie brauchen nicht den Konstruktor, können Sie machen es zu einem "public ref class" und den Konstruktor markiert als 'interne'. Irgendwie hängt von Ihrem Szenario ab.Wenn Sie stattdessen möchten, um diese Klasse öffentliche und haben einen öffentlichen Konstruktor nutzbar ist über die WinRT-Grenze (so dass es verbraucht werden kann, von C#/VB/JS), dann müssen Sie die Verwendung von WinRT-Typen (wie
Platform::String
). Innerhalb Ihrer Klasse den storage-Typ kann noch einstd::string
(obwohl ich empfehlen die Verwendung von std::wstring, ansonsten müssen Sie tun, weit-zu-eng-Konvertierungen, als Plattform::Strings sind wide-strings).Konvertieren zwischen diesen beiden Typen verwenden Sie
Platform::String::Data()
um auf die zugrunde liegendenwchar_t*
die Sie verwenden können, um zu konstruieren, einstd::wstring
. Und ebensoPlatform::String
hat einen Konstruktor, der nimmt einewchar_t*
(die können Sie ausstd::wstring::c_str()
).Können Sie nicht halten, einheimische Arten in einer verwalteten Referenz-Klasse.
Können Sie nur halten die einen Zeiger auf ein nicht verwaltetes Objekt(ein Zeiger ist nur eine Zahl, nachdem alle, und deshalb ist es erlaubt).