помощь в перегрузке дружбы и оператора - PullRequest
0 голосов
/ 16 апреля 2010

У меня есть следующий класс

#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;
    }
}


*/

У меня нет других функций в заголовочном файле (просто цитата). В любом случае, последние две функции в "/ * * /" я не могу получить, что я тут не так делаю?

первая функция - определить, равны ли два массива друг другу

Ответы [ 2 ]

7 голосов
/ 16 апреля 2010

Когда вы объявляете функцию как 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<< другом, либо добавьте в класс общедоступные средства доступа, чтобы он мог получать к ним доступ через закрытых членов.

0 голосов
/ 16 апреля 2010

Как уже отмечал Джеймс, есть некоторые проблемы с компиляцией, а также некоторые проблемы с дизайном. В вашем случае, что означает, что два контейнера равны? Одинаковый размер и стоимость хранимых объектов? Также емкость?

В любом случае, простой рефакторинг 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, влияющему на ваш результат.

...