我有一个包含一些数据的类:class DATA
现在我想创建一些使用这些数据的函数。我可以通过编写DATA::usedata();
由于有数百个函数,我会在我的代码中保留一个订单,所以我希望有一些“类别”(不确定正确的名称),如:
DATA data;
data.memory.free();
data.memory.allocate();
data.file.import();
data.whatever.foo();
其中memory
,file
以及“类别”和free
,allocate
和foo
是函数。
我尝试了继承方式,但由于我无法在DATA内部声明内存或文件对象,我迷路了,发生错误C2079:http://msdn.microsoft.com/en-us/library/9ekhdcxs%28VS.80%29.aspx
由于我不是程序员,请不要太复杂,如果你有一个更容易的方式,我会全力以赴。
答案 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。