2013-08-25 42 views
-1

我讀過的類似問題,這一點,但爲我提供沒有工作,所以解決方案。在調用C函數++,而無需創建一個對象

我想打電話給存在於位於不同的.cpp文件另一個類的功能。我不想創建對象的實例,我只是想使用該函數。

我的代碼試圖調用該函數:

switch (option) 
     { 
     case 1: 
     cout << "\nDoing stuff\n\n" ; 
     Controller::AlbumOps SayHey(); 
     //SayHey should have run but isn't working 
     break; 

而且功能我試圖撥打:

#include "Menu.hpp" 
#include "Album.hpp" 
#include "stdio.h" 
#include "AlbumOps.hpp" 
#include <iostream> 
using namespace std; 


    namespace Controller 
    { 
     static void Controller::AlbumOps::SayHey() 
     { 
     cout << "Hey\n"; 
     } 
    } 

當我執行的代碼中,從不打印嘿。我認爲解決方案是使該功能靜態,但這並不適合我。

+1

你確定你顯示的代碼編譯?! – nijansen

+0

可以使該功能靜態或將該功能移出課程。不能肯定地說沒有任何背景,但我認爲通常更好地將該功能移出課程。 – john

+0

是的,它編譯 – Dawson

回答

5
  1. 應將呼叫

     Controller::AlbumOps::SayHey(); 
         //     ^^ 
         //     double-colon 
    
  2. 你應該把static一流函數聲明,不亂類的函數定義(它意味着完全不同的東西, 「內部聯繫」)。即:

    在頭

    AlbumOps.hpp):

    // ... 
    namespace Controller 
    { 
        class AlbumOps { 
        public: 
         // ... 
         static void SayHey(); // Note: 'static' here 
        }; 
    } 
    // ... 
    

    和在實現文件(AlbumOps.cpp):或者:

    // ... 
    void Controller::AlbumOps::SayHey() // Note: no 'static' 
    { 
        cout << "Hey\n"; 
    } 
    // ... 
    

    或:

    // ... 
    namespace Controller 
    { 
        // ... 
        void AlbumOps::SayHey() // Note: no 'static', no repeated 'Controller::' 
        { 
         cout << "Hey\n"; 
        } 
        // ... 
    } 
    // ... 
    

(根據記錄,你當前

 Controller::AlbumOps SayHey(); 
     //    ^
     //     space 

確實是本地聲明名爲SayHey功能採取任何參數和返回Controller::AlbumOps(搜索「C++最棘手的解析」)。)

+0

感謝您的答案。當我按照你所說的進行函數調用時,我得到一個錯誤:對Controller的未定義引用:AlbumOps:SayHey()。我以爲我把靜態放在正確的地方?在類之前的函數體?那是你在說什麼? – Dawson

+1

我編輯了我的答案以添加信息。 –

+0

很好的答案,非常感謝。 – Dawson

相關問題