我可以在C ++中自动调用类对象声明的方法吗?

时间:2015-10-21 13:10:17

标签: c++ class object methods avr

假设我有一个具有私人设置功能的课程。有没有办法在我声明这个类的对象时自动调用该函数?

bus.h:

class BUS
{
  private:
    void setup();
  public:
    void someOtherFunction(); 
};

main.cpp中:

BUS bus; //automatically call setup() here
bus.someOtherFunction();

4 个答案:

答案 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()方法。特别是,构造函数不应该调用虚函数,尝试引发错误,访问可能未初始化的全局变量等。