2015-12-28 5 views
1

Можно ли определить ту же функцию по-разному для разных объектов одного класса? возможноМожно ли определить ту же функцию по-разному для разных объектов одного и того же класса?

в хиджры

class Hello{ 


public: 

void myfunction(); 


} 

main.cpp

Hello B0,B1; 
// Here I want to define the function 'myfunction' for each object differently 



int main(){ 

B0.myfunction(); 
B1.myfunction(); 
} 

ли это?

+0

Вы имеете в виду полиморфизм или виртуальную функцию? – user1436187

+0

Я пытаюсь создать своего рода фреймворк с использованием C++ и opengl. Предположим, что у меня есть объект класса, который позволяет говорить Button, у которого есть функция onClick. При нажатии кнопки разные пользователи должны иметь возможность определять функцию по-своему. Мне было интересно, как это можно добиться на C++ ... например, есть @override в Android –

+0

Вы хотите делать то же самое на каждом нажатии кнопки - найдите то, что пользователь указал, должно происходить на этом конкретном нажатии кнопки и делать то, что пользователь указал. –

ответ

1

Не сразу, и мне было бы интересно, почему вы хотите это сделать, если вы действительно хотите, чтобы они были объектами одного типа? Это то, на что наследуются функции и функции virtual! Если вы хотите, чтобы они вели себя по-другому, вы должны сделать их разными (но связанными) классами.

Тем не менее, я могу думать об одном способе добиться чего-то подобного. std::function.

У члена класса, как std::function<void(Hello*)> myfunctionimpl;, а затем функцию-член void myfunction() { myfunctionimpl(this); }

Затем в конструкторе Hello, вы можете установить myfunctionimpl как указатель на какой-либо другой функции, или с лямбда. Например, следующие:

#include <functional> 
#include <iostream> 
class Hello { 
    public: 
     typedef std::function<void(Hello*)> MyFunctionType; 

    private: 
     MyFunctionType myfunctionimpl; // this holds the customisable function object 

    public: 
     Hello(const MyFunctionType& mf) // construct with a custom function object passed in 
      : myfunctionimpl(mf) 
     {} 

     Hello() // construct with a default function object 
      : myfunctionimpl([](Hello *h) { 
         std::cout << "Default function called on " << h << '\n'; 
        }) 
     {} 
     Hello(int){} // dummy to leave function object unset 

     void myfunction() { 
      // call the function object, only if it is safe to do so 
      if (this->myfunctionimpl) { 
       this->myfunctionimpl(this); 
      } 
      else { 
       std::cerr << "myfunctionimpl not set!\n"; 
      } 
     } 
}; 

void freeFunction(Hello*) 
{ 
    std::cout << "freeFunction\n"; 
} 

int main() 
{ 
    Hello h1; // default 
    Hello h2(1); // not set 
    Hello h3(freeFunction); // custom function 

    h1.myfunction(); 
    h2.myfunction(); 
    h3.myfunction(); 
} 

печатает:

Default function called on 0x7fffa12518e0 
myfunctionimpl not set! 
freeFunction 

Так вот функция членmyfunction ведет себя так же, как для каждого экземпляра; вызывает объект функции myfunctionimpl (если он установлен). Но вы можете настроить объект функции, который вызывается для каждого экземпляра, поскольку это просто данные класса.

Конструктор по умолчанию демонстрирует использование lambdas, что позволяет вам писать небольшие функции на месте, что, вероятно, вам нужно, чтобы обеспечить настраиваемое поведение при построении каждого объекта. Есть много учебных пособий для лямбда, for instance.

+0

Спасибо большое .. Я на самом деле новичок в C++ ... Не могли бы вы объяснить, как работает конструктор по умолчанию? –

+0

@Sek_ice_ Я добавил примечание в конце. См. [Здесь] (http://www.drdobbs.com/cpp/lambdas-in-c11/240168241). – BoBTFish

1

Нет, функция-член всех экземпляров одного и того же класса ведет себя одинаково. Однако поведение может зависит от состояния объекта. Например, вы можете сохранить указатель на функцию в элементе данных и вызвать указанную функцию в функции-члене. Таким образом, функция-член делает то же самое для каждого экземпляра: вызывает функцию, указанную элементом, но наблюдаемое поведение может быть совершенно иным, если заостренная функция отличается.

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

0

Как из вашего комментария

Я пытаюсь создать своего рода рамки, используя C++ и OpenGL. Предположим, что у меня есть объект класса, который позволяет говорить Button, у которого есть функция onClick. При нажатии кнопки разные пользователи должны иметь возможность определять функцию по-своему.

См here за отличную статью Herb Sutter на тему virtuality, так это то, что вы бы искать при рассмотрении строить функциональные возможности, описанные в вашем вопросе и строительной базы.

Вопросы стары, но люди до сих пор продолжают спрашивать их,

Один каркасное здание может быть заинтересован в

  1. полиморфизм указателей и наследование классов;
  2. Виртуальные функции - функции-члены, поведение которых может быть переопределено в производных классах.
Смежные вопросы