- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据一本书做一些练习,我遇到了一个疑问。我已经将一些运算符重载定义为类 (Stonewt) 的友元函数。问题来自于像这样的原型(prototype):
friend ostream & operator<<(ostream &os, Stonewt &st);
friend Stonewt operator+(Stonewt &st1, Stonewt &st2);
如果我依靠构造函数进行隐式转换并让编译器完成工作,如下所示(test1 和 test2 是类对象):
cout << "Summing both weights: " << test1 + test2;
我收到如下错误信息:
无法将“std::basic_ostream”左值绑定(bind)到“std::basic_ostream&&”
正在初始化 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits; _Tp = Stonewt]'
OTOH,如果我执行以下操作,我不会收到任何错误:
Stonewt test3 = test1 + test2;
cout << "Summing both weights: " << test3;
这就像如果编译器获得一个 Stonewt 对象,它可以转换为 Stonewt&(这是函数所期望的)。但如果它得到其他东西,它就无法到达 Stonewt&。 (同样的事情发生在其他情况下,其他运算符重载如 operator*,如果我放一个 double 并期望编译器通过构造函数将它转换为 Stonewt,然后再转换为 Stonewt&,它不起作用。我必须放一个 Stonewt对象)。
我会把整个程序放在一起,以备不时之需:
类定义:
// stonewt1.h -- revised definition for the Stonewt class (for project Exercise 11.5.cbp)
#ifndef STONEWT1_H_
#define STONEWT1_H_
using std::ostream;
class Stonewt
{
public:
enum {Lbs_per_stn = 14}; // pounds per stone
enum Mode {STN, ILBS, FLBS}; // stone, integer pounds, and floating-point pounds modes
private:
int stone; // whole stones
double pds_left; // fractional pounds
double pounds; // entire weight in pounds
Mode mode; // state member
public:
Stonewt(double lbs = 0.0, Mode form = FLBS); // construct from pounds
Stonewt(int stn, double lbs, Mode form = STN); // construct from stones and pounds
~Stonewt(); // do-nothing destructor
void reset(double lbs = 0);
void reset(int stn, double lbs = 0);
void set_mode(Mode form);
Mode mode_val() const;
friend ostream & operator<<(ostream &os, Stonewt &st);
friend Stonewt operator+(Stonewt &st1, Stonewt &st2);
friend Stonewt operator-(Stonewt &st1, Stonewt &st2);
friend Stonewt operator*(Stonewt &st1, Stonewt &st2);
// conversion functions
explicit operator int() const;
explicit operator double() const;
};
#endif
方法+友元函数+转换函数实现:
// stonewt1.cpp -- Stonewt class: methods, friend functions, and conversion functions implementation (compile alongside main.cpp)
#include <iostream>
#include "stonewt1.h"
using std::cout;
// construct from pounds (both arguments defaulted, form defaulted to FLBS)
Stonewt::Stonewt(double lbs, Mode form)
{
stone = int (lbs) / Lbs_per_stn; // integer division
pds_left = int (lbs) % Lbs_per_stn + lbs - int(lbs);
pounds = lbs;
mode = form;
}
// construct from stones and pounds (form defaulted to STN)
Stonewt::Stonewt(int stn, double lbs, Mode form)
{
stone = stn;
pds_left = lbs;
pounds = stn * Lbs_per_stn + lbs;
mode = form;
}
Stonewt::~Stonewt() // do-nothing destructor
{
}
// reset object data members (don't change mode)
void Stonewt::reset(double lbs)
{
stone = int(lbs) / Lbs_per_stn;
pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs);
pounds = lbs;
}
void Stonewt::reset(int stn, double lbs)
{
stone = stn;
pds_left = lbs;
pounds = stn * Lbs_per_stn + lbs;
}
// change object mode
void Stonewt::set_mode(Mode form)
{
mode = form;
}
// returns mode
Stonewt::Mode Stonewt::mode_val() const
{
return mode;
}
// friend functions
ostream & operator<<(ostream &os, Stonewt &st)
{
if (st.mode == Stonewt::STN)
os << st.stone << " stones and " << int(st.pds_left + 0.5) << " pounds.\n";
else if (st.mode == Stonewt::ILBS)
os << int(st.pounds + 0.5) << " pounds.\n";
else if (st.mode == Stonewt::FLBS)
os << int(st.pounds) << " pounds.\n";
else
os << "Invalid mode.";
return os;
}
Stonewt operator+(Stonewt &st1, Stonewt &st2)
{
Stonewt result;
result.stone = int(st1.pounds + st2.pounds) / Stonewt::Lbs_per_stn;
result.pds_left = int(st1.pounds + st2.pounds) % Stonewt::Lbs_per_stn + (st1.pounds + st2.pounds) - int(st1.pounds + st2.pounds);
result.pounds = st1.pounds + st2.pounds;
return result;
}
Stonewt operator-(Stonewt &st1, Stonewt &st2)
{
Stonewt result;
result.stone = int(st1.pounds - st2.pounds) / Stonewt::Lbs_per_stn;
result.pds_left = int(st1.pounds - st2.pounds) % Stonewt::Lbs_per_stn + (st1.pounds - st2.pounds) - int(st1.pounds - st2.pounds);
result.pounds = st1.pounds - st2.pounds;
return result;
}
Stonewt operator*(Stonewt &st1, Stonewt &st2)
{
Stonewt result;
result.stone = int(st1.pounds * st2.pounds) / Stonewt::Lbs_per_stn;
result.pds_left = int(st1.pounds * st2.pounds) % Stonewt::Lbs_per_stn + (st1.pounds * st2.pounds) - int(st1.pounds * st2.pounds);
result.pounds = st1.pounds * st2.pounds;
return result;
}
// conversion functions
Stonewt::operator int() const
{
return int(pounds + 0.5);
}
Stonewt::operator double()const
{
return pounds;
}
客户端(未完成):
// main.cpp -- Exercising the revised Stonewt class: state member, operator overloadings (operator<<()
// replacing the show methods, operator+(), operator-(), operator*()) as friend functions.
#include <iostream>
#include "stonewt1.h"
#include <string>
int main()
{
using std::cout;
using std::cin;
using std::string;
cout << "***********************************************************************"
"*********";
cout << "*\n*\n*";
cout.width(35);
cout << "Menu:\n";
(cout << "*\n*").width(10);
(cout << "a. Reset").width(20);
(cout << "b. Select").width(20);
(cout << "c. Change mode").width(20);
(cout << "d. Show").width(0);
(cout << "\n*").width(10);
(cout << "e. Sum").width(20);
(cout << "f. Subtract").width(20);
(cout << "g. Multiply").width(20);
cout << "h. Menu";
cout << "\n*\n*\n";
cout << "***********************************************************************"
"*********\n\n";
Stonewt test1;
Stonewt test2;
Stonewt &sel = test1;
char ch {'z'};
cin.get(ch);
switch (ch)
{
case 'A' :
case 'a' : if (sel.mode_val() == 3 || sel.mode_val() == 2)
{
cout << "Enter the pounds: ";
double p {0.0};
cin >> p;
sel.reset(p);
}
else if (sel.mode_val() == 1)
{
cout << "Enter the stones: ";
int s {0};
cin >> s;
cout << "Enter the remaining pounds: ";
double p {0.0};
cin >> p;
sel.reset(s, p);
}
else
cout << "Wrong mode.";
break;
case 'B' :
case 'b' : {
cout << "Select object (1 for test1, 2 for test2): ";
int temp;
cin >> temp;
if (temp == 1)
sel = test1;
else
sel = test2;
break;
}
case 'C' :
case 'c' : {
cout << "Select the desired mode (STN, FLBS or ILBS): ";
string temp;
cin >> temp;
if (temp == "STN")
sel.set_mode(Stonewt::Mode::STN);
else if (temp == "ILBS")
sel.set_mode(Stonewt::Mode::ILBS);
else if (temp == "FLBS")
sel.set_mode(Stonewt::Mode::FLBS);
else
cout << "Wrong mode. " << sel.mode_val() << " retained.";
break;
}
case 'D' :
case 'd' : cout << sel;
break;
case 'E' :
case 'e' : cout << "Summing both weights: " << test1 + test2;
break;
case 'F' :
case 'f' : cout << "Subtracting the second weight from the first one: " << test1 - test2;
break;
case 'G' :
case 'g' : {
cout << "Choose a factor: ";
double temp;
cin >> temp;;;
sel = sel * temp;
break;
}
}
return 0;
}
最佳答案
您不能将非 const 引用绑定(bind)到临时引用,因此您需要 ostream
运算符获取 const 引用:
ostream & operator<<(ostream &os, const Stonewt &st);
为什么?因为当你这样做时:
cout << "Summing both weights: " << test1 + test2;
test1 + test2
返回一个 Stonewt
临时值,您的运算符(operator)试图通过非常量引用获取它。这是可行的,因为 test3
不是临时的:
Stonewt test3 = test1 + test2;
cout << "Summing both weights: " << test3;
关于c++ - 对重载运算符参数进行隐式转换时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11988452/
我喜欢 smartcase,也喜欢 * 和 # 搜索命令。但我更希望 * 和 # 搜索命令区分大小写,而/和 ?搜索命令遵循 smartcase 启发式。 是否有隐藏在某个地方我还没有找到的设置?我宁
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
从以下网站,我找到了执行java AD身份验证的代码。 http://java2db.com/jndi-ldap-programming/solution-to-sslhandshakeexcepti
似乎 melt 会使用 id 列和堆叠的测量变量 reshape 您的数据框,然后通过转换让您执行聚合。 ddply,从 plyr 包看起来非常相似..你给它一个数据框,几个用于分组的列变量和一个聚合
我的问题是关于 memcached。 Facebook 使用 memcached 作为其结构化数据的缓存,以减少用户的延迟。他们在 Linux 上使用 UDP 优化了 memcached 的性能。 h
在 Camel route ,我正在使用 exec 组件通过 grep 进行 curl ,但使用 ${HOSTNAME} 的 grep 无法正常工作,下面是我的 Camel 路线。请在这方面寻求帮助。
我正在尝试执行相当复杂的查询,在其中我可以排除与特定条件集匹配的项目。这是一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我正在尝试执行相当复杂的查询,我可以在其中排除符合特定条件集的项目。这里有一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我发现了很多嵌入/内容项目的旧方法,并且我遵循了在这里找到的最新方法(我假设):https://blog.angular-university.io/angular-ng-content/ 我正在尝试
我正在寻找如何使用 fastify-nextjs 启动 fastify-cli 的建议 我曾尝试将代码简单地添加到建议的位置,但它不起作用。 'use strict' const path = req
我正在尝试将振幅 js 与 React 和 Gatsby 集成。做 gatsby developer 时一切看起来都不错,因为它发生在浏览器中,但是当我尝试 gatsby build 时,我收到以下错
我试图避免过度执行空值检查,但同时我想在需要使代码健壮的时候进行空值检查。但有时我觉得它开始变得如此防御,因为我没有实现 API。然后我避免了一些空检查,但是当我开始单元测试时,它开始总是等待运行时异
尝试进行包含一些 NOT 的 Kibana 搜索,但获得包含 NOT 的结果,因此猜测我的语法不正确: "chocolate" AND "milk" AND NOT "cow" AND NOT "tr
我正在使用开源代码共享包在 iOS 中进行 facebook 集成,但收到错误“FT_Load_Glyph failed: glyph 65535: error 6”。我在另一台 mac 机器上尝试了
我正在尝试估计一个标准的 tobit 模型,该模型被审查为零。 变量是 因变量 : 幸福 自变量 : 城市(芝加哥,纽约), 性别(男,女), 就业(0=失业,1=就业), 工作类型(失业,蓝色,白色
我有一个像这样的项目布局 样本/ 一种/ 源/ 主要的/ java / java 资源/ .jpg 乙/ 源/ 主要的/ java / B.java 资源/ B.jpg 构建.gradle 设置.gr
如何循环遍历数组中的多个属性以及如何使用map函数将数组中的多个属性显示到网页 import React, { Component } from 'react'; import './App.css'
我有一个 JavaScript 函数,它进行 AJAX 调用以返回一些数据,该调用是在选择列表更改事件上触发的。 我尝试了多种方法来在等待时显示加载程序,因为它当前暂停了选择列表,从客户的 Angul
可能以前问过,但找不到。 我正在用以下形式写很多语句: if (bar.getFoo() != null) { this.foo = bar.getFoo(); } 我想到了三元运算符,但我认
我有一个表单,在将其发送到 PHP 之前我正在执行一些验证 JavaScript,验证后的 JavaScript 函数会发布用户在 中输入的文本。页面底部的标签;然而,此消息显示短暂,然后消失...
我是一名优秀的程序员,十分优秀!