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

时间:2010-05-27 15:45:46

标签: c++ class inheritance

我有一个包含一些数据的类: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

由于我不是程序员,请不要太复杂,如果你有一个更容易的方式,我会全力以赴。

5 个答案:

答案 0 :(得分:4)

为您的数据类提供一些自己的类,并让这些类引用包含它们的数据对象。听起来你可能已经尝试过这样做了。如果你有错误,那你就是做错了。

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,但我认为嵌套它们有助于显示它们的相互依赖性。

答案 1 :(得分:2)

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

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

data.file_import();

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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;
}

答案 4 :(得分:0)

当你在一个班级中拥有如此多的功能时,感到困惑是正常的。诀窍是打破它,以便信息包含在较小的类中,这些类继承了一个父类,它具有对所有子元素的通用函数和数据。

从我看到你已经找到了这个信息的通用名称。 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