0

これをどう表現すればいいのかわからないので、コードに入れてみます。(これには多くのエラーがあります。コンパイルできないことはわかっています。言葉で表現できないため、やりたいことを示すだけです)

    using namespace std; //for correctness sake
    class foo {
    public:
        foo(int a=0, int n=0);
        void stuff(int a);
        void function(int n);
        const int get_function() {return n;}
        const int get_stuff(){return a;}
    private: 
       int n, a;
    };
    struct Store{
        public: get_foo(){return vector<f.foo>;} //I'm not too sure of the syntax here but you get the idea
    private: 
        foo f;

    }

基本的に、クラス foo で返されるすべての情報を取得し、これをフォーマットしてファイルに出力したいと考えています。つまり、ファイル内にこれらの多くを作成する必要があり、価値があるためにはそれを読み戻せる必要があります。したがって、連続する各 foo クラスをファイルに追加するだけでは機能しません(少なくとも方法はわかりません)。

ostream演算子をオーバーロードするために使用しようとしまし<<たが、それを呼び出してファイルに書き込む方法がわかりません。どんな提案も大歓迎です!ありがとう。

4

3 に答える 3

2

Storeあなたは次のようになるべきだと思います:

struct Store
{
public:
    std::vector<foo> get_foo()
    {
       return f;
    }

private: 
    std::vector<foo> f;
};

をオーバーロードする<<にはstd::ostream:

std::ostream& operator<<(std::ostream& out, const Store& f)
{
  for (auto &x : f.get_foo())
    out << x.get_function() << ", " << x.get_stuff() << "\n";

  return out;
}

//Without auto

std::ostream& operator<<(std::ostream& out, const Store& f)
{
  std::vector<foo> q = f;
  for (int i=0; i<q.size(); i++)
    out << q[i].get_function() << ", " << q[i].get_stuff() << "\n";

  return out;
}
于 2013-10-03T06:19:49.950 に答える
1

あなたのコードには多くの間違いがあります。

C++ の本を読んだことがなく、コンパイラを試しているだけであることは明らかです。

そうしないでください。C++ は、多くの独立した理由から、そのようにアプローチする世界で最悪の言語です。

どんなに頭が良くても。

多くの C++ ルールは一貫した論理設計の結果ではなく、歴史的な進化と委員会の決定の結果であるため、実際にスマートであることは、特定の分野では一種の問題です。ハリ・セルドンでさえ、委員会が何を決定するかを正確に予測することはできません。歴史を推測することはできません。

良い本を選んで、最初から最後まで読んでください。C++ を学習するための賢明な方法は他にありません。

構造体をファイルに書き込むことについて、トピックは通常「シリアライゼーション」と呼ばれ、ライブオブジェクトをデッドシーケンスのバイトシーケンスに変換する (ファイルに書き込まれるか、ネットワーク経由で送信される) というやや一般的な問題と、その逆の問題である「デシリアライゼーション」に対処します。 " 一連のバイトを生きているオブジェクトに戻す変換 (同じシステム、別の同一のシステム、または別のシステムでさえも)。

この問題には多くの側面があります。たとえば、システム間の移植性、速度、バイト シーケンスのサイズ、プログラムを進化させた (バージョン管理) ためにクラスがわずかに異なっていたときに保存されたバイト シーケンスを再ロードする機能について懸念がある場合などです。 .

あなたができる最も簡単なことはfwriteファイルに何かをすることですが、これはほとんどの場合、C++ では単にナンセンスであり、技術的に可能であっても多くの理由でひどい方法です。たとえばfwritestd::vectorオブジェクトを直接読み取ることはできません。

于 2013-10-03T06:18:18.940 に答える
0

次のようなものが必要だと思います:

template<typename T>
std::ostream& operator << (std::ostream& out, const std::vector<T*>& elements)
{
  for (size_t i = 0; i < elements.size(); i++)
    out << elements[i] << ", ";
  return out << std::endl;
}
于 2013-10-03T06:15:06.503 に答える