0

Я не уверен, что я делаю неправильно здесь, но я использовал Google и нашел почти идентичный код для моего, но они не требовали ошибки. Наше задание - перегрузить оператор вставки. Проблема в том, что я получаю ошибку в драйвере за каждый раз, когда я передаю SAM или JOE. Ошибка: Ошибка 2 ошибки C2679: двоичный '< <': оператор не найден, который принимает правый операнд типа MyVector (или нет приемлемого преобразования). Любая помощь приветствуется. Обратите внимание, что я не выполнил это задание, и если другая функция кажется неправильной, возможно, потому, что я не работаю над ней. Спасибо заранее.Ошибка при перегрузке оператора ввода

Driver.cpp

#include <iostream> 
#include "MyVector.h"  
using namespace std; 

// the printV function 
// used to test the copy constructor 
// parameter: a MyVector object 
void printV(MyVector); 

int main() 
{ 
    cout << "\nCreating a vector Sam of size 4."; 
    MyVector sam(4); 

    cout << "\nPush 12 values into the vector."; 
    for (int i = 0; i < 12; i++) 
     sam.push_back(i); 

    cout << "\nHere is sam: "; 
    cout << sam; 
    cout << "\n---------------\n"; 

    cout << "\nCreating a vector Joe of size 4."; 
    MyVector joe(4); 
    cout << "\nPush 6 values into the vector."; 
    for (int i = 0; i < 6; i++) 
     joe.push_back(i * 3); 

    cout << "\nHere is joe: "; 
    cout << joe; 
    cout << "\n---------------\n"; 

    cout << "\nTest the overloaded assignment operator \"joe = sam\": "; 
    joe = sam; 

    cout << "\nHere is sam: "; 
    cout << sam; 
    cout << "\n---------------\n"; 

    cout << "\nHere is joe: "; 
    cout << joe; 
    cout << "\n---------------\n"; 

    // pass a copy of sam by value 
    printV(sam); 


    cout << endl; 
    system("PAUSE"); 
    return 0; 
} 

void printV(MyVector v) 
{ 
    cout << "\n--------------------\n"; 
    cout << "Printing a copy of a vector\n"; 
    cout << v; 
} 

Мои vector.h

#pragma once 

class MyVector 
{ 
private: 
    int vSize; 
    int vCapacity; 
    int* vArray; 
    void grow(); 

public: 
    MyVector(); 
    MyVector(int n); 
    MyVector(const MyVector& b); 
    int size() const; 
    int capacity() const; 
    void clear(); 
    void push_back(int n); 
    int& at(int n) const; 
    MyVector& operator=(const MyVector& rho); 
    ~MyVector(); 
}; 

MyVector.cpp

#include "MyVector.h" 
#include <iostream> 
using namespace std; 


MyVector::MyVector() 
{ 
    vArray = nullptr; 
    vSize = 0; 
    vCapacity = 0; 
} 

MyVector::MyVector(int n) 
{ 
    vArray = new int[vCapacity]; 
    vSize = 0; 
    vCapacity = n; 
} 

MyVector::MyVector(const MyVector& b) 
{ 
    vSize = b.size(); 
    vArray = new int[vSize]; 
    for (int i = 0; i < b.size(); i++) 
    { 
     this->vArray[i] = b.vArray[i]; 
    } 
} 

int MyVector::size() const 
{ 
    return vSize; 
} 

int MyVector::capacity() const 
{ 
    return vCapacity; 
} 

void MyVector::clear(void) 
{ 
    if (vArray != nullptr) 
    { 
     delete[] vArray; 
     vArray = nullptr; 
     vSize = 0; 
     vCapacity = 0; 
    } 
} 

void MyVector::push_back(int n) 
{ 
    if (vCapacity == 0) 
    { 
     vCapacity++; 
     int* tmp = new int[vCapacity]; 
     delete[] vArray; 
     vArray = tmp; 
    } 

    if (vSize >= vCapacity) 
    { 
     grow(); 
    } 
    vArray[vSize] = n; 
    vSize++; 
} 

void MyVector::grow() 
{ 
    vCapacity = vCapacity + vCapacity; 
    int* tmp = new int[vCapacity]; 
    for (int i = 0; i < vSize; i++) 
    { 
     tmp[i] = vArray[i]; 
    } 
    delete[] vArray; 
    vArray = tmp; 
} 

int& MyVector::at(int index) const 
{ 
    if (index >= 0 && index<vSize) 
    { 
     return vArray[index]; 
    } 
    else 
    { 
     throw index; 
    } 
} 

MyVector& MyVector::operator=(const MyVector& rho) 
{ 
    // test for self assignment 
    if (this == &rho) 
     return *this; 

    // clean up array in left hand object (this) 
    delete[] this->vArray; 

    // create a new array big enough to hold right hand object's data 
    vSize = rho.size(); 
    this->vArray = new int[vSize]; 

    // copy the data 
    for (int i = 0; i < rho.size(); i++) 
    { 
     this->vArray[i] = rho.vArray[i]; 
    } 

    // return this object 
    return *this; 
} 

MyVector::~MyVector() 
{ 
    if (vArray != nullptr) 
    { 
     clear(); 
    } 
} 

ostream& operator<<(ostream& out, const MyVector& rho) 
{ 
    for (int i = 0; i < rho.size(); i++) 
    { 
     out << rho.at(i); 
    } 
    return out; 
} 

ответ

0

Объявить std::ostream& operator<<(std::ostream& out, const MyVector& rho) в Мой vector.h. Эта функция используется в Driver.cpp, поэтому Driver.cpp должен знать об этом.

Если вы сделаете это, вы также должны #include <ostream> в My Vector.h.

+0

Как бы вы объявляете его? Я получаю несколько ошибок после объявления в файле .h. Так как это должна быть автономная функция, получается ли она после полуплощадки в файле .h (вне класса)? – ManiacalTeddy

+0

Вне класса, после полутени. И не забудьте «#include '. – Oswald

+0

Отлично, что сработало. Теперь я получаю сообщение об ошибке при вызове delete в функции grow(). Любая идея о том, почему это будет сделано? – ManiacalTeddy

0

Для использования вашего оскорбительного operator<<() в main(), при компиляции должно быть указано его объявление при компиляции Driver.cpp.

Это означает, что вам необходимо объявить operator<<() в MyVector.h.

Имея определение operator<<() в MyVector.cpp это хорошо, но это не видно компилятора при компиляции Driver.cpp

Смежные вопросы