Ich möchte einige Dinge zu Sams Antwort hinzufügen, auch wenn ich weiß, dass dies keine Code-Überprüfung ist, schreiben Sie C in C++.
C++ soll nicht in C codiert sein, es will nicht ... Es kämpfte sein ganzes Leben, um seine Grenzen mit seinem veralteten Vater zu brechen, um ihn zu übertreffen, neue Bedeutungen zu erforschen und Probleme zu lösen und bilde effizienten Code. Tun Sie das nicht zu ihm ... (Ich liebe C durch die Art und Weise veraltet, einen Witz offensichtlich war;))
Hier ist, wie ich es tun würde:
#include <fstream>
#include <iostream>
class MyClass
{
public:
MyClass() : _type(-1) {}
MyClass(int type) : _type(type) {}
inline const int &type() const
{ return _type; }
private:
int _type;
};
// -- overload of operator<< that permits me to write a MyClass* to a stream
std::ostream &operator<<(std::ostream &stream, MyClass *myClass)
{
stream << "myClass::type: " << myClass->type();
return stream;
}
struct MyStruct
{
int value;
int value2;
MyClass *myClasses[10];
MyStruct()
{
value = -1;
value2 = 1;
for (std::size_t i = 0 ; i < 10 ; ++i)
{ myClasses[i] = new MyClass(-i); }
}
};
// -- overload of operator<< that permits me to write a MyStruct to a stream
std::ostream &operator<<(std::ostream &stream, const MyStruct &myStruct)
{
stream << "myStruct::"
<< "\n\t value: " << myStruct.value
<< "\n\t value2: " << myStruct.value2
<< "\n\t myClasses: ";
for (std::size_t i = 0 ; i < 10 ; ++i)
{ stream << "\n\t\t " << myStruct.myClasses[i]; }
return stream;
}
int main()
{
std::ofstream outputFile("output.txt");
if (outputFile.is_open() == false)
{ std::cerr << "Could not open file." << std::endl; return -1; }
outputFile << MyStruct() << std::endl; // -- this is where the information is written into the file
outputFile.close();
}
einfache Art und Weise anzeigen zu schreiben eine struct, du könntest es sogar in die struct auf die gleiche Weise zurückbringen mit operator >> overload, bonus kannst du mit jedem ostream benutzen, was bedeutet, dass es mit sstream, std :: cout und allem funktioniert!
Noch ist dies nicht wirklich C++ - wie da es zu viel (ungeschützt) Zeiger und ungehemmt magische Zahl Größen (MyClass *myClasses[10];
dies eine für mich tabu ist, weil es diese Sache schon sagt: for (std::size_t i = 0 ; i < 10 ; ++i)
, und diese Scheiße gibt mir Schauer).
Ich würde wahrscheinlich eine std::array hier verwenden, aber ich wollte MyStruct behalten, wie Sie es definiert haben, damit das Beispiel "nah" an dem bleibt, was Sie geschrieben haben. Ein anderer Weg wäre gewesen, std::unique_ptr oder std::shared_ptr zu verwenden.
Dies kann als ziemlich viel Arbeit oder einschüchternd erscheinen, aber Sie können das in der Zukunft nützlich finden. Das Gleiche gilt für die Verwendung der Standard-Container (Array, Set, Vektor, Map, etc ...), unique_ptr und shared_ptr.Aber ich versichere Ihnen, dass es sich lohnt, etwas Zeit zu geben, um sie zu verstehen und zu lernen, sie zu benutzen. Es macht Dinge einfacher und sicherer.
Was mir zittert früher gab, würde so geschrieben werden:
std::array<MyClass, 10> myClasses;
Loops wie dies gehen würde:
for (std::size_t i = 0 ; i < myClasses.size() ; ++i)
{ myClasses[i].type(); }
for (std::array<MyClass, 10>::iterator itC = myClasses.begin() ; itC != myClasses.end() ; ++itC)
{ itC->type(); }
Oder noch besser, ein C++ 11 Art und Weise eine Schleife schreiben, das finde ich einfacher zu lesen und zu schreiben:
for (auto myClass : myClasses)
{ myClass.type(); }
Beachten Sie, dass, wenn Sie myClass in diesem ändern möchten Sie benötigen zu schreiben auto& myClass : myClasses
Hoffe es hilft Ihnen.
Sie speichern Zeiger auf Speicher, die Sie in Ihrem Prozess zugewiesen haben. Wenn Sie diese in einem anderen Prozess laden, sind sie bedeutungslos. Um dies zu lösen, lesen Sie das Konzept der _serialization_. – paddy