可以为同一类的不同对象定义相同的函数吗?
在A.h
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 :(得分:1)
不直接,我想知道为什么你想要这样做,如果你真的希望它们是同一类类型的对象?这就是继承和virtual
函数的用途!如果您希望它们的行为不同,您应该使它们成为不同(但相关)的类。
那就是说,我可以想到一种方法来实现这样的目标。 std::function
有一个类成员,如std::function<void(Hello*)> myfunctionimpl;
,然后是成员函数void myfunction() { myfunctionimpl(this); }
然后在Hello
的构造函数中,您可以将myfunctionimpl
设置为指向其他函数或lambda的指针。例如,以下内容:
#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,它允许您编写小函数,这可能是您在构造每个对象时提供自定义行为的过程。 lambdas有很多教程,for instance。
答案 1 :(得分:1)
不,同一个类的所有实例的成员函数的行为相同。但是,行为可以取决于对象的状态。例如,您可以将函数指针存储在数据成员中,并在成员函数中调用指向的函数。因此,成员函数对每个实例执行完全相同的操作:调用成员指向的函数,但如果指向的函数不同,则观察到的行为可能完全不同。
此外,如果函数是虚函数,则不同子类的实例可以不同地覆盖虚函数。
答案 2 :(得分:0)
从评论
开始我正在尝试使用c ++和opengl创建一种框架。假设我有一个类的对象让我们说Button有一个函数onClick。在单击按钮时,不同的用户应该能够以自己的方式定义功能。
请参阅here以获取Herb Sutter关于virtuality
主题的精彩文章,因为在您考虑构建问题和构建框架中描述的功能时,您会看到这一点。
问题很陈旧,但人们仍然不断问他们,
一个建筑框架可能对
感兴趣