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

cig3rfwq  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(187)

我目前正在练习用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

我的班级是:

#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)中复制并粘贴代码两次,程序就可以工作。否则,我会得到以下错误:

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

任何帮助都将不胜感激。谢谢。

i2byvkas

i2byvkas1#

你可以在cpp文件中使用非成员函数,但是,这些函数在声明或定义之前不能使用。
要声明一个函数,请提供它的原型,如下所示:

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

将这一行放在调用decomposeWordIntoLetters的成员函数之上,这样可以修复您看到的编译问题。
当你定义这样的函数时,你可能不仅要在头文件中隐藏它们,还要在链接到你的库的其他模块中隐藏它们。

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

请注意,当您对独立函数执行此操作时,static的含义完全不同:该函数不会成为类作用域static函数的 * 类函数 *;相反,它变成了一个可见性限于翻译单元(即定义它的单个CPP文件)的函数。

km0tfn4u

km0tfn4u2#

没有办法让类成员函数不出现在类声明中,所以如果类的声明对使用它的代码可见,那么所有的成员函数都是可见的。
有很多方法可以隐藏整个类的实现,比如“指针指向实现”模式:你公开了一个类,它只是一个接口。2它持有一个指向某个不透明对象的指针(它的完整类型声明不向用户公开),所有的公共函数都只是调用该对象上的函数的 Package 器。

class hidden_from_user;

class exposed_to_user {
private:
  hidden_from_user *impl;
public:
  // constructors, destructors, and so on.
  void frob(int howmuch);   
};

在CPP文件中:

// full declaration of hidden_from_user is available here
#include "hidden_from_user.h"  // private header, not shipped as part of API
#include "exposed_to_user.h"

// ...

void exposed_to_user::frob(int howmuch)
{
   impl->frob(howmuch);
}

您可以很自由地更改hidden_from_user的内部结构,因为客户端代码从不定义该类型的示例(您在管理内存),所以可以在代码版本之间更改对象的布局,即使API在二进制级别保持向前和向后兼容。

3zwtqj6y

3zwtqj6y3#

声明函数decomposeWordIntoLetters(字1,数组1,字大小1);.h文件中的外部类
只是原型void decomposeWordIntoLetters(字符串,整数[],整数);

相关问题