假设我有一个具有私人设置功能的课程。有没有办法在我声明这个类的对象时自动调用该函数?
bus.h:
class BUS
{
private:
void setup();
public:
void someOtherFunction();
};
main.cpp中:
BUS bus; //automatically call setup() here
bus.someOtherFunction();
答案 0 :(得分:2)
这是构造函数的用途。如果在创建对象时应始终调用setup()
,那么我们将使用构造函数调用setup()
,以便在没有任何用户干预的情况下完成。
class BUS
{
private:
void setup();
public:
Bus() { setup(); }
void someOtherFunction();
};
现在BUS bus;
将致电setup()
。
答案 1 :(得分:2)
只需将您的setup方法放在默认构造函数中,如果需要在任何其他构造函数中调用它;使用构造函数初始化列表:
class myclass{
public:
myclass(){ std::cout << "setup part" << std::endl; }
myclass(int x): myclass(){ /* calls myclass() first */ }
};
int main(int argc, char *argv[]){
myclass c0; // prints "setup part"
myclass c1{5}; // also prints "setup part"
}
这是最惯用的方式。
如果您需要延迟初始化;我喜欢使用标记的构造函数和init方法:
struct no_init_tag{};
no_init_tag no_init;
class myclass{
public:
myclass(int x){ init(x); }
myclass(no_init_tag){}
void init(int arg){ std::cout << "init with " << arg << std::endl; }
};
int main(int argc, char *argv[]){
myclass c0{5}; // prints "init with 5"
myclass c1{no_init}; // doesn't print
int n = 0;
// set 'n' somehow
c1.init(n); // prints "init with " then 'n'
}
这使得使用动态内存进行延迟初始化是不必要的,但仍然可以完成。
答案 2 :(得分:1)
你需要的只是一个构造函数:
class BUS
{
private:
void setup(){cout<<"Setup"<<endl;};
public:
BUS() // constructor
{
setup();
}
void someOtherFunction(){cout<<"Something"<<endl;};
};
您可以通过以下方式验证:
BUS bus; // will print Setup
答案 3 :(得分:0)
Google C ++风格指南也非常有用,您可能会有兴趣阅读它。来自doing work in constructors section:
通常,构造函数应该只将成员变量设置为其初始值。任何复杂的初始化都应该采用显式的Init()方法。在构造函数中工作在某些特定情况下会出现问题,因此如果您的对象需要进行非平凡的初始化,请考虑使用显式
Init()
方法。特别是,构造函数不应该调用虚函数,尝试引发错误,访问可能未初始化的全局变量等。