私有成员应该在.h或.cpp中定义?

时间:2015-05-20 08:13:40

标签: c++

风格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直截了当,我相信它的可维护性较差。

首选哪种风格?

2 个答案:

答案 0 :(得分:1)

你的三个程序并不意味着远程相同。

在第一个“样式”中,myIntmyFloatmyClass是成员。
第二,他们都不是会员 第三,myIntmyFloat是成员,而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;
}