2014-02-03 3 views
0

Я новичок в C++ и имею проблемы с функциями, которые не кажутся немного необычными (или, может быть, я просто не знаю правильного имени). Я создал вектор класса, который должен работать как вектор C++, но, вероятно, немного проще. Я знаю, что по возможности вы должны использовать уже существующие классы, но для практики я хочу создать собственный векторный класс.вызов функции без объекта в C++

Так что я хочу просто создать функцию, которую можно назвать как-то «автономной». Ранее мне удалось создать скалярную функцию (вычисляет скалярное произведение), который можно назвать как,

myVector v1(5); 
myVector v2(5); 

for(int i=0; i<5; i++){ //missing proper function here, this is not part of the question 
    v1[i] = i; 
    v2[i] = i+1; 
} 
double prod = v1.scalar(v1,v2); 
//or better 
double prod2 = v1.scalar(v2); 

Однако то, что я действительно хочу сделать, это создать функцию, которая не нуждается для работы на объекте к работе , Я хочу использовать функцию что-то вроде

double prod3 = scalar(v1,v2); 

Это возможно и где я должен определить функцию. Я хочу, чтобы он имел свойства обычной функции, а не встроенную функцию, если это возможно. Кроме того, если такие функции имеют имя, я был бы рад узнать.

/BR Patrik

+1

свободная функция? Это та же идея, но вне класса. – chris

+0

Это имя? Благодарю. где вы его определяете (кроме основного файла)? – patrik

+0

@patrik: Официальное название - это «функция, не являющаяся членом» или просто «функция». Вы можете определить их в любом исходном файле, вне любых других определений классов или функций, внутри или за пределами пространства имен. Ваша вступительная книга должна подробно описывать определения функций. –

ответ

3

Вы можете объявить функцию вне вектора класса, но в том же пространстве имен/файл, а затем определить его соответствующим образом.

Например:

namespace math { 
    class Vector 
    { 
     ... 
    } 

    double scalar(const Vector& v1, const Vector& v2); 
} 

А потом в CPP:

namespace math { 
    Vector::Vector() 
    { 
     ... 
    } 

    double scalar(const Vector& v1, const Vector& v2) 
    { 
     ... 
    } 
} 

Вам не нужно использовать пространство имен, но это делает его чище, на мой взгляд. Вызов будет выглядеть так:

math::Vector v1; 
math::Vector v2; 

double prod = math::scalar(v1, v2); 


Как было отмечено в комментариях, вы можете также поместить метод как статический член класса. Это также способ избежать добавления в глобальное пространство имен. Вы можете сделать это так:

class Vector 
{ 
    static double scalar(const Vector& v1, const Vector& v2); 
} 

А потом называют это:

myVector v1; 
myVector v2; 

... 

double prod = myVector::scalar(v1,v2); 
+3

. Добавьте пример статической функции в класс, что является другой возможностью. –

+0

Хорошо спасибо, это было именно то, что я искал. Если бы я просто поместил функцию в файл заголовка, то функция была бы скомпилирована непосредственно в основной файл вправо? Как будто там написано? – patrik

+0

@ThomasMatthews Добавлено, спасибо за предложение. –

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