如何在类中添加函数但不在C++的头文件中添加?

Joh*_*han 5 c++ scope function

我目前正在练习用C++编写类和头文件.我有一个问题:让我们说在我的头文件中我有一个客户端可以使用的公共函数,我知道如何在相应的类中实现它.但是,让我们说这个功能分为几个步骤,可以写成我不希望用户看到的独立功能(保护知识产权).通常,对于头文件中的每个已定义函数,我都会在.cpp文件中的myClassName :: myFunctionName(参数1 ..)中编写.有没有办法只在.cpp文件中定义和使用函数?例如,我写了一个程序来查看两个单词是否是字谜(具有相同的字母).

我的头文件是:

#ifndef _Anagrams_h
#define _Anagrams_h
#include <string>
using namespace std;

class Anagrams{
    public:
        Anagrams(string &s);
        static bool areTwoWordsAnagrams(string s1, string s2) ; 
        string getWord()const; 
        void setWord(string &s);

    private:
        string word;

};
#endif
Run Code Online (Sandbox Code Playgroud)

我的班级是:

#include "Anagrams.h"
#include <string>
using namespace std;

Anagrams::Anagrams(string &s){
    word = s;
}

bool Anagrams::areTwoWordsAnagrams(string word1, string word2){
    int sizeOfWord1 = word1.size();
    int sizeOfWord2 = word2.size();

    int array1[26];
    int array2[26];

    for (int i = 0; i < 26; i++){ //Initialize both arrays
        array1[i] = 0;
        array2[i] = 0;
    }


    decomposeWordIntoLetters(word1,array1,sizeOfWord1);
    decomposeWordIntoLetters(word2,array2,sizeOfWord2);

    return true;
}

string Anagrams::getWord() const{
    return word;
}

void Anagrams::setWord(string &s){
    word = s;
}

void decomposeWordIntoLetters(string word, int array[], int size){
    for (int i = 0; i < size; i++){
        char letter = word[i];
        array['z' - letter]++;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,未在头文件中定义decomposeWordIntoLetters函数.如果我在Anagrams :: areTwoAnagrams(字符串word1,字符串word2)中复制并粘贴代码两次,程序将起作用.否则,我收到以下错误:

Anagrams.cpp: In static member function ‘static bool Anagrams::areTwoWordsAnagrams(std::string, std::string)’:
Anagrams.cpp:22: error: ‘decomposeWordIntoLetters’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.谢谢.

das*_*ght 10

你肯定可以在你的cpp文件中有非成员函数.但是,这些函数在声明或定义之前可能无法使用.

要声明一个函数,请提供它的原型,如下所示:

void decomposeWordIntoLetters(string word, int array[], int size);
Run Code Online (Sandbox Code Playgroud)

将此行放在调用的成员函数上方decomposeWordIntoLetters.这应该可以解决您看到的编译问题.

当您定义这样的函数时,您可能希望不仅从标题中隐藏它们,还要从链接到库的其他模块中隐藏它们.为此,声明函数static:

static void decomposeWordIntoLetters(string word, int array[], int size);
Run Code Online (Sandbox Code Playgroud)

请注意,当您对独立功能执行此操作时,其含义static完全不同:该功能不会成为类功能的static功能; 相反,它成为一个功能,其可见性仅限于翻译单元(即定义它的单个cpp文件).