2013-08-25 40 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

相关问题