关于 C++ 类的问题(继承、变量范围和函数)

Posted

技术标签:

【中文标题】关于 C++ 类的问题(继承、变量范围和函数)【英文标题】:Problem about C++ class (inheritance, variables scope and functions) 【发布时间】:2010-05-27 15:45:46 【问题描述】:

我有一个包含一些数据的类:class DATA

现在我将创建一些使用这些数据的函数。我可以通过编写像DATA::usedata();这样的成员函数来轻松地做到这一点

由于有数百个函数,我想在我的代码中保持顺序,所以我想要一些“类别”(不确定正确的名称),例如:

DATA data;
data.memory.free();
data.memory.allocate();
data.file.import();
data.whatever.foo();

其中memoryfile 和“类别”是什么,freeallocatefoo 是函数。

我尝试了继承的方式,但是我迷路了,因为我不能在 DATA 中声明内存或文件对象,出现错误 C2079:http://msdn.microsoft.com/en-us/library/9ekhdcxs%28VS.80%29.aspx

由于我不是程序员,请不要太复杂,如果您有更简单的方法,我会全力以赴。

【问题讨论】:

如果你不是程序员,C++ 可能不适合你。 “Categories”是类的首要用途。 @BlueRaja:同意,也许你的数据同时包含太多 数百个太多了。把你的班级分开。 @GMan:我同意你的看法。 【参考方案1】:

给你的数据类一些它自己的类,并让这些类引用保存它们的数据对象。听起来您可能已经尝试过这样做。如果您遇到错误,那么您做错了其他事情。

struct DATA

  struct DataMemory
  
    DATA& data;
    DataMemory(DATA& d): data(d)  
    void free();
    void allocate();
  ;
  struct DataFile
  
    DATA& data;
    DataFile(DATA& d): data(d)  
    void import();
  ;
  struct DataWhatever
  
    DATA& data;
    DataWhatever(DATA& d): data(d)  
    void foo();
  ;

  DataMemory memory;
  DataFile file;
  DataWhatever whatever;
  DATA(): memory(*this), file(*this), whatever(*this)  
;

每个内部类都有一个成员,它是对包含的 DATA 对象的引用。他们有构造函数来允许该成员被分配。 DATA 类本身也有一个构造函数,可以用对自身的引用来初始化它的每个成员。

您现在可以实现函数并引用 DATA 对象的任何成员。

void DATA::DataMemory::free()

  data.whatever.foo();

内部类不需要是内部类;如果您愿意,它们可以是独立的***类,如 DATA,但我认为嵌套它们有助于显示它们的相互依赖关系。

【讨论】:

有趣。我喜欢它,即使我没有立即使用那种“模式”。【参考方案2】:

最简单的方法是将类别作为命名约定。如果将. 替换为_,则不需要任何“子对象”并获得:

data.memory_free();
data.memory_allocate();

data.file_import();

这样你基本上有相同的函数名,但避免了子对象方法的所有实现问题。

【讨论】:

当您在一个类中有数百个函数并且信息可以划分为专门的类时,应该这样做。否则,就像在 int main() 中编写数千行代码一样,您可以在许多较小的函数中分解信息。理解代码不会那么混乱,它会迫使人们编写更清晰的代码。一个人应该充分利用 OOP 的潜力,而不仅仅是在一个类中拥有一块信息。 @Alerty:我认为如果你只将函数分成不同的“命名空间”,这些“命名空间”都适用于基本的data 对象,我认为这不会变得更好。要建议如何将Data 拆分为更面向对象的设计,确实没有足够的信息。【参考方案3】:

如果您有一个包含数百个成员函数的类,您几乎肯定需要将其分解为多个类。要实现您所追求的命名语法类型,您可以使用名称空间将相关类分组到“类别”中。

【讨论】:

【参考方案4】:
class DATA

public:
    class CategoryA_Class
    
        friend DATA;

    private:
        CategoryA_Class()  

    public:
        bool GiveMeSomeInt()  return 1; 
    ;

    class CategoryB_Class
    
        friend DATA;

    private:
        CategoryB_Class()  

    public:
        bool GiveMeSomeBool()  return true; 
    ;

public:
    CategoryA_Class CategoryA;
    CategoryB_Class CategoryB;
;

int _tmain(int argc, _TCHAR* argv[])

    DATA mydata;

    int a = mydata.CategoryA.GiveMeSomeInt();
    bool b = mydata.CategoryB.GiveMeSomeBool();

    return 0;

【讨论】:

【参考方案5】:

当你在一个类中有这么多功能时感到困惑是很正常的。诀窍是将其全部分解,以便将信息包含在较小的类中,这些类继承了对所有子类具有通用功能和数据的父类。

据我所知,您已经找到了该信息的通用名称。 class DATA 可以是那个父类。现在,您需要将信息分解为数据类型。换句话说,您将有专门从事某事的儿童班。划分信息的一种快速方法是创建一个父类与子类链接的图表。

这是一个小例子,说明你可以做什么:

//parent class
template <class T> class Data

   T data_; //you could use an array like a std::vector or 
            //use a stream

public:
//...
   void foo();
   T getData() const;
;

//child class
template <class T> class Memory 
    : public Data

public:
   void free();
   void allocate(T data);
//...
; 

//child class
template <class T> class File 
    : public Data

public:
   T readFile(); //could read the contents of a 
                 //file and save it in data_ (class member from parent class)

   void writeFile(); //could write data_ 
                     //(class member from parent class) to a file
//...
; 

另外,如果您需要有关继承概念的帮助,这里是 documentation。

【讨论】:

以上是关于关于 C++ 类的问题(继承、变量范围和函数)的主要内容,如果未能解决你的问题,请参考以下文章

C++编程题 关于 继承和多态 的

一个关于C++多继承的问题

C++基类和派生类的构造函数

C++中子类从基类都继承啥?

C++入门访问权限管控和继承机制详解

关于C++子类构造函数的重载问题