繁体   English   中英

如何在 class 中添加 function 而不是在 C++ 中的 header 文件中?

[英]how to add function in class but not in header file in C++?

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

我的 header 文件是:

#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

我的 class 是:

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

请注意,header 文件中未定义 decomposeWordIntoLetters function。 如果我在 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

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

您绝对可以在cpp文件中具有非成员函数。 但是,在声明或定义这些函数之前,不得使用它们。

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

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

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

当定义这样的函数时,您可能不仅要对标头隐藏它们,还要对链接到库的其他模块隐藏它们。 为此,将函数声明为static

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

请注意,对独立函数执行此操作时, static的含义完全不同:该函数不会像类作用域中的static函数一样成为函数; 取而代之的是,它变成一种功能,其可见性仅限于转换单元(即定义了单个cpp文件)。

没有办法使类成员函数不会出现在类声明中,因此,如果类的声明对于使用它的代码可见,则所有成员函数都是可见的。

有很多方法可以隐藏整个类的实现,例如“实现的指针”模式:公开一个仅是接口的类。 它拥有指向一些不透明对象的指针(不向用户公开其完整类型声明),并且所有公共函数只是包装器,它们在该对象上调用函数。

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在二进制级别保持向前和向后兼容,也可以在代码的发行之间更改对象的布局。

声明 function decomposeWordIntoLetters(word1,array1,sizeOfWord1); 在 class in.h 文件之外

只是原型 void decomposeWordIntoLetters(string, int[], int );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM