c*******u 发帖数: 1269 | 1 需要release lib and headers to others。但是以前的设计没有考虑到这
点,头文件
里有很多实现细节。是用 abstract class还是用pimpl隐藏细节呢?还有其他方法吗?
这两种方法改起来都不简单。而且project 非常performance sensitive,这两种都有
overheard,是不是pimpl稍好?谢谢! |
w***g 发帖数: 5958 | 2 还有一种办法,就是干脆包一层C的API. 工作量应该跟abstract class或者pimpl想当,
但是更加generic.而且免了你在两者间做选择.不少支持第三方语言API的轮子都是
C++实现套C API.
我个人比较喜欢abstract class, 我觉得更加elegant. Performance几乎不会有任何
差别. 不信你可以用perf去测. abstract class vs pimpl实现用perf测出来
第一行百分比变化我觉得不会超过2%. 我可以赌100伪币.
【在 c*******u 的大作中提到】 : 需要release lib and headers to others。但是以前的设计没有考虑到这 : 点,头文件 : 里有很多实现细节。是用 abstract class还是用pimpl隐藏细节呢?还有其他方法吗? : 这两种方法改起来都不简单。而且project 非常performance sensitive,这两种都有 : overheard,是不是pimpl稍好?谢谢!
|
Y**G 发帖数: 1089 | 3 现在貌似“继承"是个很糟糕的概念,用嵌入才是正道。golang干脆取消了继承。
【在 w***g 的大作中提到】 : 还有一种办法,就是干脆包一层C的API. 工作量应该跟abstract class或者pimpl想当, : 但是更加generic.而且免了你在两者间做选择.不少支持第三方语言API的轮子都是 : C++实现套C API. : 我个人比较喜欢abstract class, 我觉得更加elegant. Performance几乎不会有任何 : 差别. 不信你可以用perf去测. abstract class vs pimpl实现用perf测出来 : 第一行百分比变化我觉得不会超过2%. 我可以赌100伪币.
|
c*******u 发帖数: 1269 | 4 包一层一个function 要call两遍,感觉会比abstract 还慢。我试了pimpl,nested
class在init lock和access parent class的时候都有问题。还没找到解决办法。我再
试试abstract 吧。好多头文件,头大。
多些回答。
: 还有一种办法,就是干脆包一层C的API. 工作量应该跟abstract class或者pimpl
想当,
: 但是更加generic.而且免了你在两者间做选择.不少支持第三方语言API的轮子都是
: C 实现套C API.
: 我个人比较喜欢abstract class, 我觉得更加elegant. Performance几乎不会有
任何
: 差别. 不信你可以用perf去测. abstract class vs pimpl实现用perf测出来
: 第一行百分比变化我觉得不会超过2%. 我可以赌100伪币.
【在 w***g 的大作中提到】 : 还有一种办法,就是干脆包一层C的API. 工作量应该跟abstract class或者pimpl想当, : 但是更加generic.而且免了你在两者间做选择.不少支持第三方语言API的轮子都是 : C++实现套C API. : 我个人比较喜欢abstract class, 我觉得更加elegant. Performance几乎不会有任何 : 差别. 不信你可以用perf去测. abstract class vs pimpl实现用perf测出来 : 第一行百分比变化我觉得不会超过2%. 我可以赌100伪币.
|
d****i 发帖数: 4809 | 5 没看懂,头文件里应该没有任何具体实现的细节,只有函数/类/变量的声明,怎么会有
问题呢?比如下面的头文件:
//my_header.h
int foo1();
void foo2(char* a);
class MyClass {
public:
bool foo3(int a);
};
所有的实现都应该放在cpp文件里面进行,哪怕是用了template也是如此。
【在 c*******u 的大作中提到】 : 需要release lib and headers to others。但是以前的设计没有考虑到这 : 点,头文件 : 里有很多实现细节。是用 abstract class还是用pimpl隐藏细节呢?还有其他方法吗? : 这两种方法改起来都不简单。而且project 非常performance sensitive,这两种都有 : overheard,是不是pimpl稍好?谢谢!
|
S*******s 发帖数: 13043 | 6 priviate members are also included although they should be hidden.
【在 d****i 的大作中提到】 : 没看懂,头文件里应该没有任何具体实现的细节,只有函数/类/变量的声明,怎么会有 : 问题呢?比如下面的头文件: : //my_header.h : int foo1(); : void foo2(char* a); : class MyClass { : public: : bool foo3(int a); : }; : 所有的实现都应该放在cpp文件里面进行,哪怕是用了template也是如此。
|
d****i 发帖数: 4809 | 7 当然,private和public都可以声明在头文件里面,而且其实也只能这样声明类,实现
的话都应该放到cpp文件里面。
【在 S*******s 的大作中提到】 : priviate members are also included although they should be hidden.
|
r***o 发帖数: 24 | 8 put all private data and functions into a private data blob class.
for example;
====== .h =====
class MyPrivateClass
class MyClass {
public:
// public data fields and functions
void foobar();
private:
MyPrivateClass * pc;
char datablob[xxx]; // if you don't want dynamic allocation
}
============ .cpp ========
class MyPrivateClass {
friend class MyClass;
private:
// anything you don't want to export
// all data are private, except
// MyClass is friend
}
void MyClass::foobar() {
return pc->func(this);
}
|
S*******s 发帖数: 13043 | 9 这个“当然”的意思是你问上面的问题之前就知道这个答案?那个问题不是求教而是考
察?
【在 d****i 的大作中提到】 : 当然,private和public都可以声明在头文件里面,而且其实也只能这样声明类,实现 : 的话都应该放到cpp文件里面。
|
c*******u 发帖数: 1269 | 10 这个就是Pimpl的一种实现。
【在 r***o 的大作中提到】 : put all private data and functions into a private data blob class. : for example; : ====== .h ===== : class MyPrivateClass : class MyClass { : public: : // public data fields and functions : void foobar(); : private: : MyPrivateClass * pc;
|
k***g 发帖数: 166 | 11 现在template已经可以不用放在头文件里了吗?
【在 d****i 的大作中提到】 : 没看懂,头文件里应该没有任何具体实现的细节,只有函数/类/变量的声明,怎么会有 : 问题呢?比如下面的头文件: : //my_header.h : int foo1(); : void foo2(char* a); : class MyClass { : public: : bool foo3(int a); : }; : 所有的实现都应该放在cpp文件里面进行,哪怕是用了template也是如此。
|