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 回答