关于 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();
其中memory
、file
和“类别”是什么,free
、allocate
和foo
是函数。
我尝试了继承的方式,但是我迷路了,因为我不能在 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++ 类的问题(继承、变量范围和函数)的主要内容,如果未能解决你的问题,请参考以下文章