【问题标题】:ostream method does not workostream 方法不起作用
【发布时间】:2014-07-29 11:23:46
【问题描述】:

我有两个方法第一个定义字符串:

我不明白为什么它不成功,以及我如何从 main 调用这个方法。

Actor::operator std::string( ) const {
    std::stringstream ss;
    ss << this->_id;
    std::string str1 = ss.str();

    std::stringstream s;
    s << this->_salary;
    std::string str2 = s.str();

    std::string str3 = "Actor first name = " + this->_firstname + ", last name = " + this->_lastname+", id = " + str1 + ", monthly salary = " + str2;
    if (this->_hasoscar==true)
        str3+=" was NOMINATED Oscar AWARD..";

    return str3;
}

下一个需要打印出来

const Actor& Actor::print(std::ostream& os) {
    os<< std::string();
    return *this;
}

【问题讨论】:

  • 你误用了this
  • 不编译?问题出在哪里?
  • 它正在编译,但我不知道如何从 main 调用它
  • @GR Envoy 重要吗? :)
  • @James 这对我很重要。我不得不受苦,他们也要受苦!

标签: c++ methods iostream


【解决方案1】:

不清楚为什么要这样做,因为正常的工作方式是重载 ostream 运算符:

class Actor  {
public:
  friend std::ostream& operator<< (std::ostream& os, const Actor& a) {
    os << "Actor first name = " + a._firstname + 
          ", last name = " + a._lastname+", id = " + 
          a._id + ", monthly salary = " + a._salary;
    if (this->_hasoscar) {
       os << " was NOMINATED Oscar AWARD.."; 
    } 
    return os;
  }
};

通过这种方式,您可以轻松地从 main 中创建和打印 actor:

Actor a;
cout << a; 

第一种方法

Actor::operator std::string() const();

允许你从 Actor 到字符串的隐式转换,例如:

Person a;
std::string s = a;

【讨论】:

  • 我不这么称呼它:a.print ?
  • @user3669000:不,这不是传统的做法。不过,这也不会是
【解决方案2】:

os&lt;&lt; std::string();

这不会调用到string的转换,它会创建一个临时字符串变量并将其写入流中,所以相当于:

os << "";

要调用转换运算符,您需要告诉编译器您要将对象转换为字符串(而不仅仅是构造一个空字符串)。这样做的明确方法是:

os << static_cast<std::string>(*this);

还有其他方式如:

os << std::string(*this);

os << (std::string)*this;

std::string s = *this;
os << s;

或者如果您喜欢不可读的代码,您可以显式调用转换运算符:

os << this->operator std::string();

(最后一种方法不是一个好主意。)

转换运算符的定义非常愚蠢,而且比它需要的要慢得多。使用两个单独的字符串流以及字符串连接非常浪费,您可以使用单个字符串流完成所有操作:

Actor::operator std::string( ) const {
    std::stringstream ss;
    ss << "Actor first name = " << this->_firstname
       << ", last name = " << this->_lastname
       << ", id = " << this->_id
       << ", monthly salary = " << this->_salary;

    if (this->_hasoscar==true)
        ss << " was NOMINATED Oscar AWARD..";

    return ss.str();
}

但是,正如 Velthune 所说,除非您出于其他原因需要转换为字符串,否则输出类的常用方法是为该类重载 operator&lt;&lt;

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2016-01-07
    • 2016-01-11
    相关资源
    最近更新 更多