[英]C++: hide class construction from user
我正在开发一系列事件类。 这些类包含从系统获取的信息。 它们来自不同的性质,并且可能包含不同的消息,例如:一个可能的事件将包含一个巨大的数字列表,而另一个可能以字符串形式携带查询信息。 我想创建一个生成器函数,该函数创建正确类型的事件并返回给用户。
这是它的样子的演示:
main.cpp:
#include <iostream>
#include "A.h"
#include "dA.h"
using namespace std;
int main()
{
cout << "Hello world!" << endl;
A a = build(5);
return 0;
}
Event.h:
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
#include <iostream>
class A
{
public:
friend A build(int x);
protected:
A(int x);
private:
};
#endif // A_H_INCLUDED
event.cpp:
#include "A.h"
A::A(int x)
{
{
std::cout << "A\n";
std::cout << x << std::endl;
}
}
A build(int x)
{
if(x == 5)
return dA(x);
return make(x);
}
特别活动
#ifndef DA_H_INCLUDED
#define DA_H_INCLUDED
#include <iostream>
#include "A.h"
class dA : public A
{
public:
protected:
dA(int x);
};
#endif // DA_H_INCLUDED
特殊event.cpp:
#include "dA.h"
dA::dA(int x) : A(x)
{
std::cout << "dA\n";
}
如您所见,所有构造函数都受到保护,目的是向用户隐藏构造-不应从无创建事件,只有系统可以创建事件-并确保构建函数将返回正确的类型事件。
编译时,我得到:
error: 'build' was not declared in this scope
warning: unused variable 'a' [-Wunused-variable]
如果将所有内容都放在同一个文件中,则可以编译,但是最终我会得到一个难以管理的巨大文件。 请注意,上面的代码只是一个示例,我将使用的实际类非常庞大,将所有内容都放在同一个文件中,无论是声明还是实现,一切都变得一团糟。
您必须声明build
函数。 现在,您只告诉编译器它是A
的friend
,但没有在全局范围内声明它。
只需在Ah
头文件中添加一个原型:
A build(int x);
看来您没有将文件正确链接在一起。 好像您正在使用GCC(根据错误消息判断),可以通过两种方式进行操作:
一步将编译和链接结合在一起:
$ g++ main.cpp event.cpp -Wall -g -o my_program
在上面的命令中,您告诉GCC编译文件main.cpp
和event.cpp
并将它们链接在一起,生成my_program
可执行文件。 标志-Wall
启用更多警告(这很好,我个人使用更多选项来启用许多警告),- -g
告知GCC包括调试信息。
第二种方法是将文件分别编译为目标文件,然后在单独的步骤中将这些目标文件链接在一起:
$ g++ main.cpp -c -Wall -g $ g++ event.cpp -c -Wall -g $ g++ main.o event.o -o my_program
新的标志-c
告诉GCC生成一个与源文件同名的目标文件,因此对于main.cpp
它将被命名为main.o
然后,最后一条命令获取这些目标文件,并将它们链接到可执行文件my_program
。
如果您有很多源文件,则首选第二种方法,就像您对单个源文件进行更改一样,不必仅将更改后的所有文件重新编译一次。 由于一直需要手动编写这些命令,这是一项繁重的工作,因此建议使用诸如make
工具来自动执行这些任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.