p*****y 发帖数: 1049 | 1 c++语言委员会曾经讨论过类似于java和d语言的import module 的方案。
然而最终决定暂不将其加入c++17的目标中。原因是macro无法回避。
我思考c++语言的一种折中的新特性。
众所周知,c++的类定义存在一个严重的缺陷。类必须定义在头文件里面,这样就不
得不暴露私有成员,无法实现真正意义上的封装。
举例子 :
在c++语言里,可以在头文件中如此声明一个函数
void foo();
然后在cpp文件中定义这个函数。
但是在c++语言中,只能如此定义一个类:
class A
{
public:
void foo();
private:
int I;
}
这样私有成员就被暴露在头文件里面。违反了封装的基本原则。
我提议一种c++的新特性:允许分次定义一个类。
在头文件里,可以定义类的一部分。在cpp文件里面,可以定义类的另外一部分。
两部分不能互相冲突,不能有所重叠。
例如 在A.h里可以定义:
class A
{
public:
void foo();
}
然后在A.cpp 文件里定义
class A
{
public:
void function_user_cannot_see();
private:
int I;
}
这样子,在 A.h里面的所有函数,不能看到I的存在,直到在I定义之后. 调用A.h的用
户,也看不到void function_user_cannot_see(); 哪怕这个函数是public函数。.cpp
文件里面定义的函数不可以为虚函数。
这样的好处就在于,一个类的私有变量真正实现了封装。
编译器实现这个功能其实很容易,只需要使用pimpl即可。将所有用户不希望看到的成
员定义在一个class B里面,然后把A在头文件里定义为
Class A
{
B * B_is_implementaion_that_user_cannot_See;
Public:
Void foo();
} |
h**6 发帖数: 4160 | |
p*****y 发帖数: 1049 | 3 sizeof 必须在link之后才能得到
比如如果#include 然后link A.lib
这时候才能得到sizeof(A)
这样可以吗?
【在 h**6 的大作中提到】 : sizeof(A)怎样实现?
|
t**8 发帖数: 4527 | 4 Current C++ already supports this feature
publish Interface class only, all other classes are hidden.
User can only call interface function to access the object
另外, 封装有什么用吗?
封装不是加密, 只是提醒使用者, 不要引用或改变私有变量
并不是对用户保密
【在 p*****y 的大作中提到】 : c++语言委员会曾经讨论过类似于java和d语言的import module 的方案。 : 然而最终决定暂不将其加入c++17的目标中。原因是macro无法回避。 : 我思考c++语言的一种折中的新特性。 : 众所周知,c++的类定义存在一个严重的缺陷。类必须定义在头文件里面,这样就不 : 得不暴露私有成员,无法实现真正意义上的封装。 : 举例子 : : 在c++语言里,可以在头文件中如此声明一个函数 : void foo(); : 然后在cpp文件中定义这个函数。 : 但是在c++语言中,只能如此定义一个类:
|
p*****y 发帖数: 1049 | 5 封装是为了在不变更头文件的情况下,可以变更库文件
【在 t**8 的大作中提到】 : Current C++ already supports this feature : publish Interface class only, all other classes are hidden. : User can only call interface function to access the object : 另外, 封装有什么用吗? : 封装不是加密, 只是提醒使用者, 不要引用或改变私有变量 : 并不是对用户保密
|
t**8 发帖数: 4527 | 6 那就用interface 吧
没有任何private 的东西
【在 p*****y 的大作中提到】 : 封装是为了在不变更头文件的情况下,可以变更库文件
|
r*******n 发帖数: 3020 | 7 PIMPL idiom 是干这个的
【在 p*****y 的大作中提到】 : c++语言委员会曾经讨论过类似于java和d语言的import module 的方案。 : 然而最终决定暂不将其加入c++17的目标中。原因是macro无法回避。 : 我思考c++语言的一种折中的新特性。 : 众所周知,c++的类定义存在一个严重的缺陷。类必须定义在头文件里面,这样就不 : 得不暴露私有成员,无法实现真正意义上的封装。 : 举例子 : : 在c++语言里,可以在头文件中如此声明一个函数 : void foo(); : 然后在cpp文件中定义这个函数。 : 但是在c++语言中,只能如此定义一个类:
|
d****n 发帖数: 12461 | 8 现在有没有预编译器已经可以在编译之前立即生成头文件的啊? |
x****u 发帖数: 44466 | 9 微软自己早加了import
只要你的dll里面有tlb,剩下的一切都自动生成,header包含,智能指针的宏都有
【在 p*****y 的大作中提到】 : c++语言委员会曾经讨论过类似于java和d语言的import module 的方案。 : 然而最终决定暂不将其加入c++17的目标中。原因是macro无法回避。 : 我思考c++语言的一种折中的新特性。 : 众所周知,c++的类定义存在一个严重的缺陷。类必须定义在头文件里面,这样就不 : 得不暴露私有成员,无法实现真正意义上的封装。 : 举例子 : : 在c++语言里,可以在头文件中如此声明一个函数 : void foo(); : 然后在cpp文件中定义这个函数。 : 但是在c++语言中,只能如此定义一个类:
|