9

私は現在、C++ でクラスとヘッダー ファイルを書く練習をしています。質問があります。ヘッダー ファイルに、クライアントが使用できるパブリック関数があり、それぞれのクラスでそれを実装する方法を知っているとしましょう。ただし、この関数はいくつかのステップに分割されており、ユーザーに見られたくない独立した関数として記述できるとしましょう (知的財産を保護します)。通常、ヘッダー ファイルで定義されている関数ごとに、.cpp ファイルに myClassName::myFunctionName(parameter 1 ..) を記述します。.cpp ファイルでのみ関数を定義して使用する方法はありますか? たとえば、2 つの単語がアナグラム (文字が同じ) かどうかを調べるプログラムを作成しました。

私のヘッダーファイルは次のとおりです。

#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

私のクラスは:

#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]++;
    }
}

decomposeWordIntoLetters 関数がヘッダー ファイルで定義されていないことに注意してください。コードをコピーして Anagrams::areTwoAnagrams(string word1, string word2) に 2 回貼り付けると、プログラムは機能します。そうしないと、次のエラーが表示されます。

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

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

13

cpp ファイルには非メンバー関数を含めることができます。ただし、これらの関数は、宣言または定義する前に使用することはできません。

関数を宣言するには、次のようにそのプロトタイプを提供します。

void decomposeWordIntoLetters(string word, int array[], int size);

を呼び出すメンバー関数の上にこの行を配置しますdecomposeWordIntoLetters。これにより、発生しているコンパイルの問題が修正されるはずです。

そのような関数を定義する場合、ヘッダーからだけでなく、ライブラリにリンクする他のモジュールからも関数を非表示にしたい場合があります。そのためには、関数を宣言しますstatic

static void decomposeWordIntoLetters(string word, int array[], int size);

独立した関数に対してそれを行う場合、 の意味は完全に異なることに注意してください。関数は、クラススコープ関数としてクラス関数staticにはなりません。代わりに、可視性が翻訳単位 (つまり、それが定義されている単一の cpp ファイル) に制限された関数になります。static

于 2013-06-14T01:29:14.290 に答える