3

メンバーがこの関数に一致するクラスを実装したい:

int get(
  string &host_,
  string &port_, 
  string url_path,
  ostream &out_,
  vector<string> &headers, 
  unsigned int timeout
  )

私はこれを持っています:

#include <string>
#include <vector>
#include <iostream>
#include <istream>
#include <ostream>
#include "Register.h"

using namespace std;

class Request : public Register {

private:
string *host;
string *port;
string *url;
ostream *out;
vector<string> *header;
unsigned int *timeout;

public:
Request() {
  this -> host = new string();
  this -> port = new string();
  this -> url = new string();
  this -> out = new ostream();
  this -> header = new vector<string>();
  this -> timeout = new int();
}

しかし、私はそれをインスタンス化することができません。たとえば、ostream はどうなっていますか。

this -> out = new ostream();

私はまだ c++ に不慣れで、完全に混乱しており、Google で正しい答えを見つけることができませんでした。

4

4 に答える 4

2

std::ostreamは、 などの特定のストリーム実装の基本クラスであり、std::ofstream直接インスタンス化することはできません。

C++ では、Java とは異なり、すべてをヒープに割り当てるのではなく、値のセマンティクスを優先します。

/// Can be easily copied
class HoldSomething {
private:
    std::string name;
    std::vector<std::string> values;
public:
    /// constructors
    HoldSomething() : name(), values() {}
    explicit HoldSomething( const std::string& name ) :
        name( name ), values() {}
    /// modifiers
    void addValue( const std::string& val ) {
        value.push_back( val );
    }
...
于 2012-08-10T13:34:21.897 に答える
0

参照とポインタの間で混乱していると思います。この関数は、ベクトル &headers、文字列 &host_ などの参照を受け取ります。クラスは、同じものではないポインターを格納します。

変数を関数に普通に渡すと (シグネチャに * や & がない場合)、渡したもののコピーが作成されます。これが「コピー渡し」です。ポインター (*) を渡す場合は、使用する変数のメモリ アドレスを指す何かを渡します。技術的にはコピーでポインタを渡していますが、同じものを指しているので問題ありません。参照 (&) を渡すと、関数が呼び出されるスコープから変数にエイリアスが設定されます。あなたは、「この変数をコピー渡しのように扱いたいのですが、最初に関数に渡されたものにも外側のスコープから変更を適用したい」と言っています。

したがって、クラスには代わりに通常のメンバーを含めることができます。

private:
string host;
string port;
string url;
ostream out;
vector<string> header;
unsigned int timeout;

そうすれば、問題なく関数に直接渡すことができます。この場合、それらはデフォルトで構築されるため、「new」を使用したり、何もする必要はありません。実際、コンストラクタを記述する必要さえありません。

これらを非公開にしたため、これらすべてを変更できるようにするには、アクセサー関数が必要になる可能性があります。または、構造体を使用する前にデータメンバーに有用な値を与えることができるように、コンストラクターにパラメーターを持たせる必要があります。

PS:出力の代わりに std::ofstream を使用したい :) 以下のリンクで次の例を確認してください。

http://www.cplusplus.com/doc/tutorial/files/

于 2012-08-10T13:31:06.397 に答える
0

発生しているエラーを投稿する必要があります。std::ostreamインターフェイスのみです。あなたはそれを行使することはできません。

于 2012-08-10T13:31:16.453 に答える
0

std::ostream は単なるインターフェースです。「std::cout」または std::ostream から派生した別の具象オブジェクトによって「out」ポインタを初期化できます。例えば:

out = &std::cout;

また

std::ofstream file("file.txt");
out = &file;

ところで、単純なポインタを使用するのは悪い考えです。std::shared_ptr や std::unique_ptr などのスマート ポインターを試してください。

于 2012-08-10T13:41:10.607 に答える