2016-11-25 5 views
7

Я должен реализовать класс Vector, который устанавливает координаты многомерного вектора и будет работать при вызове с этим определенным кодом (я не могу изменить эту часть):Множественный оператор точка (с ++ класс)

const int NumOfDimensions = 5; 
    Vector x (NumOfDimensions); 
    x.Set(0, 1.1).Set(1, 1.2).Set(2, 1.3).Set(3, 1.4).Set(4, 1.5); 
    x.print(); 

и выход должен быть таким:

(1,1, 1,2, 1,3, 1,4, 1,5)

Это то, что Я пытался, но не мог заставить его работать:

class Vector { 
float *coordinates; 
int dimensions; 

public: 
Vector(int k) 
{ 
coordinates = new float[k]; 
dimensions = k; 
} 
void Set(int k, float wsp) 
{ 
    //Vector x(k+1); 
    coordinates[k] = wsp; 
    //return x; 
} 
void print() 
{ 
    int i; 
    cout<<"("; 
    for(i=0; i<dimensions; i++) 
    cout<<coordinates[i]<<", "; 
    cout<<")"<<endl; 
} 
}; 

Так что я знаю функцию Set необходимо изменить и, возможно, вернуть объект, но я пробовал много разных способов, и он просто не работает. Как мне его изменить?

ответ

12

Если вы хотите быть в состоянии методов цепи этого рода нужно возвращать ссылку:

Vector& Set(int k, float wsp) { 
    // ... 

    return *this; 
} 

Я бы утверждать, что даже если вы видите много, что и на других языках, таких как Python, Ruby и так далее, этот интерфейс не очень C++.

Вам будет лучше использовать std::vector для хранения coordinates, массивы C-стиля - это не что иное, как проблема. Этот код действительно имеет серьезную утечку памяти, так как вы не выделяете delete[], нет деструктора. Использование контейнера стандартной библиотеки разгружает эту ответственность.

Другая вещь, которую вы можете сделать, чтобы сделать это более родной C++ является определение форматчик для того, чтобы вы могли просто сбросить это cout непосредственно вместо того, чтобы неуклюжий метод, называемый print, который делает это для вас:

std::ostream& operator<<(std::ostream& stream, const Vector& vec); 

Это позволит использовать этот форматтер на любом потоке, а не только cout.

+0

Спасибо! он работает, не могу поверить, что я потратил 2 часа на это, а затем получил ответ здесь через 1 минуту. – mushisgosu

+0

Это необычный шаблон для использования на C++, который, вероятно, почему вы не видите многого для него. – tadman

+1

@mushisgosu, если ответ решил вашу проблему, вы должны отметить его как принятый. –