风格1:
A.H
create table pst(col1 number, col2 number, col3 number, col4 number);
create type pst_t as object (
col1 number,
col2 number,
col3 number,
col4 number);
create type pst_table_t as table of pst_t;
declare
v_coll pst_table_t;
C_LIMIT constant pls_integer := 1000;
cursor v_cur is
select
pst_t(level, level*2, level*3, level*4)
from dual
connect by level <= 9500;
begin
open v_cur;
loop
fetch v_cur bulk collect into v_coll limit C_LIMIT;
insert into pst(col1,col2,col3,col4)
select col1,col2,col3,col4 from table(v_coll);
exit when v_coll.count < C_LIMIT;
end loop;
end;
风格2:
A.H
#include "MyClass.h"
class A{
private:
int myInt;
float myFloat;
MyClass myClass;
};
A.cpp
class A{
};
样式3:
A.H
#include "MyClass.h"
int myInt;
float myFloat;
MyClass myClass;
A.cpp
class A{
private:
int myInt;
float myFloat;
};
我知道Style 1最简单,但它至少有一个问题:在A.h需要#include“MyClass.h”
样式2移动.cpp中的所有私有成员,它阻止#include“MyClass.h”暴露给Ah并隐藏更多来自.h的细节,但它至少有一个缺点:代码可读性较差,我不知道如果我只读Ah,那么关于这个课程的所有细节。
Style 3似乎得到了平衡,但我相信代码不如Style 2直截了当,我相信它的可维护性较差。
首选哪种风格?
答案 0 :(得分:1)
你的三个程序并不意味着远程相同。
在第一个“样式”中,myInt
,myFloat
和myClass
是成员。
第二,他们都不是会员
第三,myInt
和myFloat
是成员,而myClass
则不是。
如果您希望这三个成员都是成员,那么必须在类定义中声明,如第一个示例所示。
如果您不希望标头依赖于MyClass
的定义,请使用该类的前向声明并添加间接:
class MyClass;
class A{
private:
int myInt;
float myFloat;
MyClass* myClass;
};
答案 1 :(得分:0)
我采用不同的风格:
风格1:没错。但要求用户在包含A.h
时包含MyClass.h样式2:您已将私有成员更改为“全局”变量。它们的值和实例在A类的所有实例之间共享。当您开始在A中定义操作这些变量然后创建A的不同实例的方法时,这将成为一个问题。
样式3:与样式2类似,不同之处在于它仅适用于MyClass对象。其他人都很安全。
防止用户包含MyClass标头。您可以使用前向声明并将MyClass成员更改为MyClass *类型(指针)。从私有定义屏蔽类的用户并不是一件坏事。人们有时会使用它来提供更多自包含的代码,并减轻提供所有依赖关系的负担。它还可以帮助减少编译时间。
你的A.h看起来像这样:
#ifndef _A_H_
#define _A_H_
class MyClass;
class A {
A();
~A();
private:
int myInt;
float myFloat;
MyClass *myClass;
};
#endif // _A_H_
和你的A.cpp
#include "A.h"
#include "MyClass.h"
A::A() {
myClass = new MyClass();
}
A::~A() {
delete myClass;
}