![](/img/trans.png)
[英]How to handle a C++ header file with a extern call to C function and a class object
[英]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.