类、异常和操作符

Classes Exceptions and Operators

本文关键字:操作符 异常      更新时间:2023-10-16

我有一些麻烦让很多操作符工作

赋值指令如下

赋值的目的是处理异常。随你的便回想一下,我给你提供了一个名为FlashDrive的样例类如下图所示。你可以获取源代码到FlashDrive类在这里(。net或。net 2010)我希望你加强类,以便调用其方法或操作符时可能抛出异常,而不仅仅是将错误消息打印到cout。目前,我们最喜欢的异常类是std::logic_error。你可以通过向其构造函数传递字符串值来创建logic_error。正式地说,你也应该说#include to begin work与logic_error,但Visual Studio(作为一个不良行为的孩子…)让你离开这里吧。一旦一切正常运转,驱动程序代码应该像类中描述的那样运行。

尽管示例驱动程序代码可能不支持所有这些在以下情况下,我希望您抛出异常:

更多的东西已经放入驱动器超过它可以安全容纳(由于writeData)

一个负数可能被用作my_StorageUsed值(due)对于发送给构造函数调用的操作符或错误值)

一个负数可能用作my_StorageCapacity值(由于将操作符值或错误值发送给构造函数调用)的所有操作符和方法,请仔细浏览类,确保在每个类中都抛出logic_error环境。

我还想让你得到operator <<操作员>>为类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 ------构建开始7/29/2013 4:48:43 AM。InitializeBuildStatus:触摸"DebugFlashDriver.unsuccessfulbuild"。ClCompile: Main.cppC:documents and settingsadministratormy documentsvisual studio2010projectsflashdriverflashdrivermain.cpp(28): error C2678二进制'>>':没有找到左操作数为的操作符输入'std::istream'(或者没有可接受的转换)c:program filesmicrosoft visual studio 10.0vcincludeistream(1053): could be 'std::basic_istream<_Elem,_Traits> &std::operator

> (std:: basic_istream<_Elem _Traits>,,, char *)签署的与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1060):或'std::basic_istream<_Elem,_Traits> &std::operator>(std::basic_istream<_Elem,_Traits> &&,signed char &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1067):或'std::basic_istream<_Elem,_Traits> &std::operator>(std::basic_istream<_lem,_Traits> &&,unsigned char *)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1074):或'std::basic_istream<_Elem,_Traits> &std::operator>(std::basic_istream<_lem,_Traits> &&,unsigned char &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1097):或'std::basic_istream<_Elem,_Traits> &std::operator>(std::basic_istream<_lem,_Traits> &,signed char *)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1104):或'std::basic_istream<_Elem,_Traits> &std::operator>(std::basic_istream<_lem,_Traits> &,signed char &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1111):或'std::basic_istream<_Elem,_Traits> &std::operator>(std::basic_istream<_lem,_Traits> &,unsigned char *)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1118):或'std::basic_istream<_Elem,_Traits> &std::operator>(std::basic_istream<_lem,_Traits> &,unsigned char &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(1128):或'std::basic_istream<_Elem,_Traits> &std::operator, cs52:: FlashDrive> (std:: basic_istream<_Elem _Traits>,,, _Ty,)"与[_Elem =字符,_Traits = std:: char_traits,_Ty = cs52:: FlashDrive]c:program filesmicrosoft visual studio 10.0vcincludeistream(179):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator(std:: basic_istream<_Elem>和特征(_cdecl *) (std:: basic_istream<_Elem _Traits>,))"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(185):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator(std:: basic_ios<_Elem>和特征(_cdecl *) (std:: basic_ios<_Elem _Traits>,))"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(192):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(std::ios_base . c)(__cdecl *)(std::ios_base &))'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(199):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(std::_Bool &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(218):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(short &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(253):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(unsigned short &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(272):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(int &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(298):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(unsigned int &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(316):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(long &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(334): or 'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(unsigned long &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(354):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,Traits>::operator>>(_int64 &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(373):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(unsigned __int64 &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(392):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(float &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(411):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(double &)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(429):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(长双精度&)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(447):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator>>(void *&)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeistream(466):或'std::basic_istream<_Elem,_Traits>&std::basic_istream<_Elem,_Traits>::operator(std:: basic_streambuf<_Elem, _Traits> *)"与[_Elem =字符,_Traits = std:: char_traits]在尝试匹配参数列表'(std::istream, cs52::FlashDrive)' c:documents and settingsadministratormy时文件的visual studio 2010projectsflashdriverflashdrivermain.cpp(33):错误C2679:二进制'<<':没有找到带右操作数的运算符键入'cs52::FlashDrive'(或者没有可接受的转换)c:program filesmicrosoft visual studio 10.0vcincludeostream(679):可以是'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,, const char *)"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(726):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,,字符)"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(764):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,, constchar *)与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(811):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,,字符)"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(937):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,, constSigned char *)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(944):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,,签名字符)"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(951):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,, constUnsigned char *)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(958):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,,无符号字符)"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(968):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;, cs52:: FlashDrive> (std:: basic_ostream<_Elem _Traits>,,, _Ty)"与[_Elem =字符,_Traits = std:: char_traits,_Ty = cs52:: FlashDrive]c:program filesmicrosoft visual studio 10.0vcincludeostream(1085):或'std::basic_ostream<_Elem,_Traits> &std::operator& lt; & lt;> (std:: basic_ostream<_Elem _Traits>,, const std:: error_code,)"与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(186):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator& lt; & lt; (std:: basic_ostream<_Elem>和特征(_cdecl*) (std:: basic_ostream<_Elem _Traits>,))与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(192):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator& lt; & lt; (std:: basic_ios<_Elem>和特征(_cdecl*) (std:: basic_ios<_Elem _Traits>,))与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(199):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base . exe)(__cdecl *)(std::ios_base &))'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(206):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(226):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(short)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(260):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(280):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(int)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(305):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(325):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(long)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(345):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(366):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,Traits>::operator <<(_int64)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(386):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(407):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(float)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(427):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(double)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(447):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(long double)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(467):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator <<(const void *)'与[_Elem =字符,_Traits = std:: char_traits]c:program filesmicrosoft visual studio 10.0vcincludeostream(487):或'std::basic_ostream<_Elem,_Traits>&std::basic_ostream<_Elem,_Traits>::operator& lt; & lt; (std:: basic_streambuf<_Elem _Traits> *)"与[_Elem =字符,_Traits = std:: char_traits]在尝试匹配参数列表'(std::ostream, cs52::FlashDrive)' c:documents and settingsadministratormy时文件的visual studio 2010projectsflashdriverflashdrivermain.cpp(38):错误C2146:语法错误:标识符' - '之前缺少';设置administratormy documentsvisual studio2010projectsflashdriverflashdrivermain.cpp(38):错误C2065: ' - ':未声明的标识符c:documents and settingsadministratormy文件的visual studio 2010projectsflashdriverflashdrivermain.cpp(38):错误C2146:语法错误:标识符"drive1"之前缺少";"生成代码…

构建失败了。

时间流逝00:00:01.82========== 构建:0成功,1失败,最新的,0跳过 ==========

您需要为class FlashDrive定义operator>>

friend std::istream& operator>>(std::istream& is, FlashDrive& fd)
{
is >> my_StorageCapacity >> my_StorageUsed >> my_IsPluggedIn;
return is;
}

类似的,你可以定义operator<<

std::ostream& operator>>(std::ostream& os, const FlashDrive& fd)
{
os << fd.getCapacity() << fd.getUsed() << fd.isPluggedIn();
return os;
}