【发布时间】:2013-07-29 04:52:54
【问题描述】:
我在让很多操作员工作时遇到了一些麻烦
赋值指令如下
此作业的目的是处理异常。如你所愿 回想一下,我为您提供了一个名为 FlashDrive 的示例类,它 如下图所示。您可以获取源 此处的 FlashDrive 类(.NET 或 .NET 2010)我希望您加强 此类,以便调用其方法或运算符可能会抛出 异常,而不仅仅是将错误消息打印到 cout。 目前,我们最喜欢的异常类是 std::logic_error。你可以 通过将字符串值传递给其构造函数来创建 logic_error。 正式地,您还应该说#include 开始工作 使用 logic_error,但 Visual Studio(作为一个行为不端的孩子......) 让你摆脱它。一旦你让一切正常工作, 驱动程序代码应该按照类中的描述运行。
尽管示例驱动程序代码可能无法针对所有这些 在以下情况下,我希望您在以下情况下抛出异常:
放入驱动器的东西超过了它可以安全容纳的东西(由于 写数据)
负数可能用作 my_StorageUsed 值(由于 to operator - 或者错误的值被发送到构造函数调用)
负数可能用作 my_StorageCapacity 值 (由于操作员 - 或错误的值被发送到构造函数调用) 因此,请仔细遍历所有运算符和方法 确保在这些中的每一个中都抛出 logic_error 的类 情况。
我还希望您让操作员 > 为 类闪存驱动器。最后,我希望你将 FlashDrive 放入 命名空间 cs52。
下面是我的代码和构建输出
FlashDrive.h
#ifndef FLASHDRIVE_H
#define FLASHDRIVE_H
#include <iostream>
#include <cstdlib>
namespace cs52 {
class FlashDrive {
friend FlashDrive operator+ (FlashDrive used1 , FlashDrive used2);
friend FlashDrive operator- (FlashDrive used3, FlashDrive used4 );
public:
FlashDrive& FlashDrive::operator=(int);
FlashDrive::FlashDrive(int);
FlashDrive& operator = (const FlashDrive& usedtotal){
my_StorageUsed= usedtotal.my_StorageUsed;
return *this;
}
FlashDrive( );
FlashDrive( int capacity, int used, bool pluggedIn );
void plugIn( );
void pullOut( );
void writeData( int amount );
void eraseData( int amount );
void formatDrive( );
int getCapacity( );
void setCapacity( int amount );
int getUsed( );
void setUsed( int amount );
bool isPluggedIn( );
private:
int my_StorageCapacity; // in kilobytes
int my_StorageUsed; // in kilobytes
bool my_IsPluggedIn; // am I attached to a computer?
}extern drive1,drive2;
inline FlashDrive operator+ (FlashDrive used1, FlashDrive used2 ) {
FlashDrive plus;
plus.my_StorageUsed = (used1.getUsed()+ used2.getUsed());
return plus;
}
inline bool operator< (FlashDrive &lhs,FlashDrive &rhs ) {
return ( lhs.getUsed() < rhs.getUsed() );
}
inline bool operator> (FlashDrive &lhs,FlashDrive &rhs ) {
return ( operator <( rhs, lhs ) );
}
inline FlashDrive operator - (FlashDrive used3, FlashDrive used4 ){
FlashDrive minus;
minus.my_StorageUsed = (used3.getUsed()- used4.getUsed());
return minus;
};
}
#endif
FlashDrive.cpp
#include <iostream>
#include <cstdlib>
#include "FlashDrive.h"
namespace cs52 {
FlashDrive::FlashDrive( ) {
my_StorageCapacity = 0;
my_StorageUsed = 0;
my_IsPluggedIn = false;
}
FlashDrive::FlashDrive( int capacity, int used, bool pluggedIn ) {
my_StorageCapacity = capacity;
my_StorageUsed = used;
my_IsPluggedIn = pluggedIn;
}
void FlashDrive::plugIn( ) {
my_IsPluggedIn = true;
}
void FlashDrive::pullOut( ) {
my_IsPluggedIn = false;
}
void FlashDrive::writeData( int amount ) {
my_StorageUsed += amount;
}
void FlashDrive::eraseData( int amount ) {
my_StorageUsed -= amount;
}
void FlashDrive::formatDrive( ) {
my_StorageUsed = 0;
}
int FlashDrive::getCapacity( ) {
return( my_StorageCapacity );
}
void FlashDrive::setCapacity( int amount ) {
my_StorageCapacity = amount;
}
int FlashDrive::getUsed( ) {
return( my_StorageUsed );
}
void FlashDrive::setUsed( int amount ) {
my_StorageUsed = amount;
}
bool FlashDrive::isPluggedIn( ) {
return( my_IsPluggedIn );
}
}
Main.cpp
#include <iostream>
#include <cstdlib>
#include "FlashDrive.h"
void main( )
{
using namespace cs52;
cs52::FlashDrive empty;
cs52::FlashDrive drive1( 10, 0, false );
cs52::FlashDrive drive2( 20, 0, false );
drive1.plugIn( );
drive1.formatDrive( );
drive1.writeData( 5 );
drive1.pullOut( );
drive2.plugIn( );
drive2.formatDrive( );
drive2.writeData( 1 );
drive2.pullOut( );
// read in a FlashDrive...
// the class designer for FlashDrive (that's you!)
// gets to decide which fields matter and should be read in
cs52::FlashDrive sample;
cin >> sample;
// print out a FlashDrive...
// the class designer for FlashDrive (that's you!)
// gets to decide which fields matter and should be printed
cout << sample << endl;
cs52::FlashDrive combined = drive1 + drive2;
cout << "this drive's filled to " << combined.getUsed( ) << endl;
cs52::FlashDrive other = combined – drive1;
cout << "the other cup's filled to " << other.getUsed( ) << endl;
if (combined > other) {
cout << "looks like combined is bigger..." << endl;
}
else {
cout << "looks like other is bigger..." << endl;
}
if (drive2 > other) {
cout << "looks like drive2 is bigger..." << endl;
}
else {
cout << "looks like other is bigger..." << endl;
}
if (drive2 < drive1) {
cout << "looks like drive2 is smaller..." << endl;
}
else {
cout << "looks like drive1 is smaller..." << endl;
}
// let's throw some exceptions...
try {
empty = empty - combined;
cout << "something not right here..." << endl;
} catch( std::logic_error ) {
// an exception should get thrown...
// so the lines of code here should
// be run, not the cout statement...
}
try {
drive2.writeData( 10000 );
cout << "something not right here..." << endl;
} catch( std::logic_error ) {
// an exception should get thrown...
// so the lines of code here should
// be run, not the cout statement...
}
try {
cs52::FlashDrive f( -1, -1, false );
cout << "something not right here..." << endl;
} catch( std::logic_error ) {
// an exception should get thrown...
// so the lines of code here should
// be run, not the cout statement...
}
}
我收到一条非常奇怪的错误消息
------ 构建开始:项目:FlashDriver,配置:调试 Win32 ------ 构建开始于 2013 年 7 月 29 日凌晨 4:48:43。 InitializeBuildStatus:触摸“Debug\FlashDriver.unsuccessfulbuild”。 Cl编译:Main.cpp c:\文档和设置\管理员\我的文档\visual studio 2010\projects\flashdriver\flashdriver\main.cpp(28):错误 C2678: binary '>>' : 没有找到接受左操作数的运算符 输入“std::istream”(或者没有可接受的转换) c:\program files\microsoft visual studio 10.0\vc\include\istream(1053): 可能是 'std::basic_istream<_elem> &std::operator
>(std::basic_istream<_elem> &&,signed char *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1060): 或 'std::basic_istream<_elem> &std::operator >(std::basic_istream<_elem> &&,signed char &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1067): 或 'std::basic_istream<_elem> &std::operator >(std::basic_istream<_elem> &&,unsigned char *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1074): 或 'std::basic_istream<_elem> &std::operator >(std::basic_istream<_elem> &&,unsigned char &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1097): 或 'std::basic_istream<_elem> &std::operator >(std::basic_istream<_elem> &,signed char *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1104): 或 'std::basic_istream<_elem> &std::operator >(std::basic_istream<_elem> &,signed char &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1111): 或 'std::basic_istream<_elem> &std::operator >(std::basic_istream<_elem> &,unsigned char *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1118): 或 'std::basic_istream<_elem> &std::operator >(std::basic_istream<_elem> &,unsigned char &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(1128): 或 'std::basic_istream<_elem> &std::operator ,cs52::FlashDrive>(std::basic_istream<_elem> &&,_Ty &)' 和 [ _Elem=char, _Traits=std::char_traits, _Ty=cs52::闪存盘 ] c:\program files\microsoft visual studio 10.0\vc\include\istream(179): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator (std::basic_istream<_elem>Traits> &(_cdecl *)(std::basic_istream<_elem> &))' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(185): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator (std::basic_ios<_elem>Traits> &(_cdecl *)(std::basic_ios<_elem> &))' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(192): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(std::ios_base &(__cdecl *)(std::ios_base &))' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(199): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(std::_Bool &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(218): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(short &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(253): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(unsigned short &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(272): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(int &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(298): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(unsigned int &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(316): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(long &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(334): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(unsigned long &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(354): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>特征>::operator >>(_int64 &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(373): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(unsigned __int64 &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(392): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(float &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(411): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(double &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(429): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(long double &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(447): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator >>(void *&)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\istream(466): 或 'std::basic_istream<_elem> &std::basic_istream<_elem>::operator (std::basic_streambuf<_elem> *)' 和 [ _Elem=char, _Traits=std::char_traits ] 在尝试匹配参数列表 '(std::istream, cs52::FlashDrive)' c:\documents and settings\administrator\my 文件\视觉工作室 2010\projects\flashdriver\flashdriver\main.cpp(33):错误 C2679: 二进制 ' &std::operator (std::basic_ostream<_elem> &,const 字符 *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(726): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,char)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(764): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,const 字符 *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(811): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,char)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(937): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,const 签名字符 *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(944): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,已签名 字符)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(951): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,const 无符号字符 *)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(958): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,无符号字符)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(968): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &&,_Ty)' 和 [ _Elem=char, _Traits=std::char_traits, _Ty=cs52::闪存盘 ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(1085): 或 'std::basic_ostream<_elem> &std::operator (std::basic_ostream<_elem> &,const std::error_code &)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(186): 或 'std::basic_ostream<_elem> &std::basic_ostream<_elem>::operator 特征> &(_cdecl *)(std::basic_ostream<_elem> &))' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(192): 或 'std::basic_ostream<_elem> &std::basic_ostream<_elem>::operator 特征> &(_cdecl *)(std::basic_ios<_elem> &))' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(199): 或 'std::basic_ostream<_elem> &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>特征>::operator _int64)' 和 [ _Elem=char, _Traits=std::char_traits ] c:\program files\microsoft visual studio 10.0\vc\include\ostream(386): 或 'std::basic_ostream<_elem> &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator &std::basic_ostream<_elem>::operator *)' 和 [ _Elem=char, _Traits=std::char_traits ] 在尝试匹配参数列表 '(std::ostream, cs52::FlashDrive)' c:\documents and settings\administrator\my 文件\视觉工作室 2010\projects\flashdriver\flashdriver\main.cpp(38):错误 C2146: 语法错误:缺少 ';'在标识符“-”之前 c:\documents 和 设置\管理员\我的文档\visual studio 2010\projects\flashdriver\flashdriver\main.cpp(38):错误 C2065:'–': 未声明的标识符 c:\documents and settings\administrator\my 文件\视觉工作室 2010\projects\flashdriver\flashdriver\main.cpp(38):错误 C2146: 语法错误:缺少';'在标识符 'drive1' FlashDrive.cpp 之前 正在生成代码...
构建失败。
经过时间 00:00:01.82 ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
【问题讨论】:
-
你试过什么?如果您没有为
FlashDrive类指定任何操作员>>,错误消息有什么奇怪的? -
第一条错误信息告诉你没有定义
operator>>,这是真的。如果可能,请使用 SSCE (sscce.org) 逐步了解错误消息并提出更具体的问题
标签: c++ class exception namespaces operators