2016-10-25 2 views
1

Если у меня есть заголовочный файл, который гласитмне нужно указать класс для каждой реализации функции в C++

class fanStatusManager{ 


public: 

    //default constructor 
    fanStatusManager(); 

    public fanstatus_t setFanStatus(fanstatus_t status); 

private: 
    //etc 
}` 

и CPP файл, который реализует их:

fanStatusManager::fanStatusManager(){ 
    //default constructor TODOi 
} 

fanstatus_t fanStatusManager::setFanStatus(fanstatus_t status){ 
    //TODO: imlement this! 
    assert(false); 
} 

я получаю немного устал ввода «fanStatusManager ::» перед каждой реализацией. Можно ли как-нибудь обойти это?

+2

copy paste ...: D – Matt

+1

Боюсь, что вы это сделаете. Если вы этого не сделаете, как компилятор может сказать, для какого класса он предназначен для реализации метода? – Baldrick

+0

Если вы используете Visual Studio, обратитесь к http://stackoverflow.com/questions/17961648/fast-way-to-generate-code-functions-from-header-functions-in-visual-studio – Uday

ответ

1

Хотя можно не вводить имя класса, если вы размещаете реализацию в заголовке, т.е.

class fanStatusManager{ 
public: 
    public fanstatus_t setFanStatus(fanstatus_t status) { 
     //TODO: imlement this! 
     assert(false); 
    } 
} 

нет никакого способа обойти эту проблему, если вы реализуете член-функцию отдельно. Это потому, что С ++ позволяет свободно стоячих функции, то есть этот синтаксис вполне допустимо:

fanstatus_t setFanStatus(fanstatus_t status) { 
    //TODO: imlement this! 
    assert(false); 
} 

выше определяет свободно стоящая функция называется setFanStatus, который не связан с любым классом.

1

Вы можете встраивать функции члена в определении класса

class fanStatusManager 
{ 

    public: 

    //default constructor 
     fanStatusManager() 
     { 
      //default constructor TODOi 
     }; 

    fanstatus_t setFanStatus(fanstatus_t status) 
    { 
      //TODO: implement this! 
      assert(false); 
    }; 
    private: 
    //etc 
}; 

Недостатком этого является то, что всякий раз, когда вы изменяете реализацию функции члена, вы изменяете файл заголовка, который определяет класс. Это заставляет перекомпилировать блок компиляции EVERY (также известный как исходный файл), который зависит от файла заголовка.

На практике, если ваш проект не является МАЛЕНЬКОЙ и ТРИВАЙНОЙ (например, все живет в одном исходном файле), вам лучше не делать этого, за исключением очень конкретных случаев (например, аксессуаров, которые никогда не будут изменены). Усилия ввода fanStatusManager будут выполняться ровно один раз для каждой функции-члена. Это гораздо менее значимо, чем время и скука, которые вы испытаете, когда сможете просмотреть, как каждый исходный файл будет перекомпилирован, когда вы измените реализацию любой функции-члена ..... даже единицы компиляции, которые фактически не используют функцию-член, которую вы были изменены.

-1

Если вам не нужен этот класс, вы можете просто положить его в пространстве имен

namespace fanStatusManager 
{ 
    fanstatus_t setFanStatus(fanstatus_s status) 
    { 
    ... 
    }; 
} 

и тогда вы просто положить в верхней части файла

using namespace fanStatusManager; 

Он не будет создайте любой объект, такой как класс, но я думаю, что функциональность должна быть такой же. (Если вам не нужно создавать объект или работать с любыми свойствами этого класса)

Смежные вопросы