【问题标题】:C++ object with members for an asio get method具有 asio get 方法成员的 C++ 对象
【发布时间】:2012-08-10 13:14:32
【问题描述】:

我想实现一个成员匹配这个函数的类:

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 上找不到正确的答案。

【问题讨论】:

    标签: c++ class member ostream


    【解决方案1】:

    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 );
        }
    ...
    

    【讨论】:

    • name(), values() 到底是什么意思??
    • 这些是对成员变量的构造函数调用。查看更新的代码。
    【解决方案2】:

    您应该发布您遇到的错误。 std::ostream只是接口;你不能实例化它。

    【讨论】:

      【解决方案3】:

      我认为您对引用和指针感到困惑。该函数采用向量 &headers、字符串 &host_ 等引用。您的类存储了不同的指针。

      如果您通常将变量传递给函数(签名中没有 * 或 &),那么您将创建您传递的内容的副本。这就是“逐个传递”。如果您传入一个指针 (*),则您传递的内容指向您要使用的变量的内存地址。从技术上讲,您是通过副本传递指针,但它指向同一事物,所以您没问题。如果你传入一个引用 (&),那么你就是在调用函数的作用域中为变量取别名。您是说“我想像通过副本一样对待这个变量,除了我希望将更改应用于最初从外部范围传递给函数的变量”。

      所以,你的类可以包含普通成员:

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

      这样您就可以毫无问题地将它们直接传递给函数。在这种情况下,它们也将是默认构造的,因此您无需使用“新”或做任何事情。事实上,你甚至不需要编写构造函数。

      请注意,您可能需要一个访问器函数来修改所有这些,因为您将它们设为私有,或者您需要让您的构造函数接受参数,以便在使用结构之前为数据成员提供有用的值。

      PS:您想使用 std::ofstream 代替您的输出 :) 在下面的链接中查看以下示例:

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

      【讨论】:

        【解决方案4】:

        std::ostream 只是一个接口 您可以通过“std::cout”或派生自 std::ostream 的另一个具体对象来初始化“out”指针。例如:

        out = &std::cout;
        

        或

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

        顺便说一句,使用普通指针是个坏主意。尝试任何智能指针,例如 std::shared_ptr 或 std::unique_ptr。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-21
          • 2013-07-07
          • 1970-01-01
          • 2019-11-19
          • 2019-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多