我有以下课程
#ifndef Container_H
#define Container_H
#include <iostream>
using namespace std;
class Container{
friend bool operator==(const Container &rhs,const Container &lhs);
public:
void display(ostream & out) const;
private:
int sizeC; // size of Container
int capacityC; // capacity of dynamic array
int * elements; // pntr to dynamic array
};
ostream & operator<< (ostream & out, const Container & aCont);
#endif
和此源文件
#include "container.h"
/*----------------------------*********************************************
note: to test whether capacityC and sizeC are equal, must i add 1 to sizeC?
seeing as sizeC starts off with 0??
*/
Container::Container(int maxCapacity){
capacityC = maxCapacity;
elements = new int [capacityC];
sizeC = 0;
}
Container::~Container(){
delete [] elements;
}
Container::Container(const Container & origCont){
//copy constructor?
int i = 0;
for (i = 0; i<capacityC; i++){ //capacity to be used here?
(*this).elements[i] = origCont.elements[i];
}
}
bool Container::empty() const{
if (sizeC == 0){
return true;
}else{
return false;
}
}
void Container::insert(int item, int index){
if ( sizeC == capacityC ){
cout << "\n*** Next: Bye!\n";
return; // ? have return here?
}
if ( (index >= 0) && (index <= capacityC) ){
elements[index] = item;
sizeC++;
}
if ( (index < 0) && (index > capacityC) ){
cout<<"*** Illegal location to insert--"<< index << ". Container unchanged. ***\n";
}//error here not valid? according to original a3? have i implemented wrong?
}
void Container::erase(int index){
if ( (index >= 0) && (index <= capacityC) ){ //correct here? legal location?
int i = 0;
while (i<capacityC){ //correct?
elements[index] = elements[index+1]; //check if index increases here.
i++;
}
sizeC=sizeC-1; //correct? updated sizeC?
}else{
cout<<"*** Illegal location to be removed--"<< index << ". Container unchanged. ***\n";
}
}
int Container::size()const{
return sizeC; //correct?
}
/*
bool Container::operator==(const Container &rhs,const Container &lhs){
int equal = 0, i = 0;
for (i = 0; i < capacityC ; i++){
if ( rhs.elements[i] == lhs.elements[i] ){
equal++;
}
}
if (equal == sizeC){
return true;
}else{
return false;
}
}
ostream & operator<< (ostream & out, const Container & aCont){
int i = 0;
for (i = 0; i<sizeC; i++){
out<< aCont.elements[i] << " " << endl;
}
}
*/
我在头文件中没有其他功能(只是一个quikie)。无论如何,“/ * * /”中的最后两个函数我无法工作,我在这里做错了什么?
第一个函数是查看两个数组是否彼此相等
答案 0 :(得分:7)
当你在一个类中声明一个函数friend
时,该函数是一个非成员函数,就好像它是在封闭的命名空间中声明的一样。因此,在您的情况下,您声明了朋友operator==
,
class Container
{
friend bool operator==(const Container &rhs,const Container &lhs);
};
是一个非成员函数,就好像你已经在类之外声明它一样,如下所示:
class Container
{
};
bool operator==(const Container &rhs,const Container &lhs);
请注意,当您声明友元函数时,该函数也可以访问该类的私有成员,因此这不完全相同。
所以,你对operator==
的定义好像是一个成员函数是不正确的:
bool Container::operator==(const Container &rhs,const Container &lhs) { ... }
应该是
bool operator==(const Container &rhs,const Container &lhs) { ... }
至于您的operator<<
重载,它不是Container
的朋友,因此无法访问elements
的私有Container
成员。要么让operator<<
成为朋友,要么将公共访问者添加到类中,以便它可以通过它们访问私有成员。
答案 1 :(得分:0)
詹姆斯已经指出了一些编译问题,还有一些设计问题。在你的情况下,两个容器相等是什么意思?存储对象的大小和值是否相同?容量?
无论如何,operator==
的简单重构将是:
bool operator==( Container const & lhs, Container & rhs )
{
if ( lhs.size() != rhs.size() ) return false;
if ( lhs.capacity() != rhs.capacity() ) return false; // optional if same capacity is required
for ( int i = 0; i < lhs.size(); ++i ) { // Note: only check valid objects
// memory in [size,capacity) can or not be
// equal and should not affect the result
if ( lhs[i] != rhs[i] ) return false;
}
return true; // all tests passed
}
与您的实现的区别(忽略您尝试将其作为成员方法实现的事实)是此版本将快速失败:早在结果已知时,它将被返回给调用者。如果尺寸不同,则无需检查所有元素。此外,没有必要比较容器中不存在的元素。如果[data[size]
,data[capacity]
中的任何元素在两个数组中重合,则会增加影响结果的equals
计数。