2015-10-21 42 views
0

可以說我有一個私人設置功能的類。有沒有辦法在我聲明這個類的對象時自動調用函數?我可以自動調用C++中的對象聲明類的方法嗎?

bus.h:

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

main.cpp中:

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

只需使用一個構造函數,甚至不聲明'setup'方法。除非你需要延遲初始化,否則這是非常直觀的。 – CoffeeandCode

+1

試着看看這個列表,以便你介紹到正確的C++,http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – g24l

+0

「它是如此之大和複雜,有很多非常糟糕的C++書籍 - 「哦,我有一些:D – mrv

回答

2

這是一個構造函數是什麼。如果在創建對象時始終應調用setup(),則我們將使用構造函數調用setup(),以便在沒有任何用戶干預的情況下完成。

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

現在BUS bus;將調用setup()

+0

是的,就是這樣。顯然我讀到的關於C++類的東西太基礎了,沒有提到將函數放在構造函數中。現在構造函數的概念對我來說完全有意義。感謝一羣 – mrv

1

所有你需要的是一個構造函數:

class BUS 
{ 
private: 
void setup(){cout<<"Setup"<<endl;}; 
public: 
BUS() // constructor 
{ 
setup(); 
} 
void someOtherFunction(){cout<<"Something"<<endl;}; 
}; 

您可以驗證通過:

BUS bus; // will print Setup 
2

只要把你的設置方法在默認的構造函數,如果你需要調用在任何其他構造函數;使用構造函數初始化列表:

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' 
} 

這使得它,以便使用動態內存延遲初始化不是必需的,但還可以做。

0

Google C++風格指南也非常有用,您可能有興趣閱讀它。從doing work in constructors section

通常,構造函數應該只將成員變量設置爲它們的初始值。任何複雜的初始化應該在一個明確的Init()方法中進行。在某些特定情況下,在構造函數中執行工作會遇到問題,因此如果您的對象需要非平凡的初始化,請考慮使用明確的方法Init()。具體而言,構造函數不應該調用虛函數,試圖引發錯誤,獲得潛在的未初始化的全局變量等

+0

風格指南可能是OP的需要(我不會推薦Google風格指南),但它不回答這個問題。這將更適合作爲評論。 – CoffeeandCode

相關問題