2016-08-30 98 views
2

假设我有一个类MyClass。现在我想使用另一个叫做Animals的类,我可能会这样做。用C++中的指针初始化

class MyClass 
{ 
public: 
    MyClass(); 
private: 
    Animals animals; 
}; 

不过,我也可以这样做:

class MyClass 
{ 
public: 
    MyClass(); 
private: 
    Animals* animals; 
}; 

,然后初始化类与构造函数:

animals = new Animals(); 

两者有什么不同方法之间的区别,这是更好,为什么?在我的使用Animals应该只在MyClass内使用。我的问题主要是关于性能内存,我的意思是通过指针初始化需要更多的资源或不?

+4

这听起来像一个家庭作业问题。你可以指定你的问题一点点 – TankorSmash

+2

看起来你需要阅读[this](http://stackoverflow.com/questions/162941/why-use-pointers) – NathanOliver

+0

@TankorSmash这不是一个家庭作业的问题,但我会尝试改进我的问题 – daljit97

回答

5

如果你考虑如何在一个类中管理内存,它应该变得清晰。当你在你的课堂上申报Animals animal时,空间在你班级的内存占用空间中保留为animal。但是当你声明Animals* animal时,只有你的类的内存占用空间保留了一个指向Animal的指针。

既不是更好,因为它取决于你的情况。如果你总是要创建一个动物,并且MyClass拥有它,那么使用第一种方法,因为它只需要一次内存分配。如果animals通常可能是空的并且内存是一个问题,那么您可能需要使用第二种方法。

顺便说一句,如果您使用的是C++ 11或更高版本,则可能需要考虑std::unique_ptr<Animal>作为第二种情况。

1

如果animals对象的唯一性取决于MyClass对象上,然后用遏制

class MyClass 
{ 
public: 
    MyClass(); 
private: 
    Animals animals; 
}; 

如果animals的存在是独立的,但MyClass要保持的关联,然后使用指针

class MyClass 
{ 
public: 
    MyClass(); 
private: 
    Animals * animals; 
}; 

的选择取决于物体自身上ership模型。

有许多考虑因素。

在遏制方法中,animals的内存与MyClass对象一起分配。他们总是走在一起,MyClass完全拥有animals

在指针方法中,它们是两个独立的内存块,需要分别分配。这是一个没有任何所有权的协会。纵观MyClass寿命,多件事情可能会发生:

  • myclass不联想到任何Animals,即animals = nullptr
  • myclass可以关联到不同Animals在不同的时间,即animals = a1; /* ... */; animals = a2;

而且多个对象,要么MyClass对象或其他类型的对象, may hold the same animals`指针。

如果animals对象被销毁,那么这些对象有使用陈旧指针的风险,因此有必要使用某种机制来避免这种情况。

使用指针方法,可以使用运行时多态,这在包容方法中是不可能的。例如

void MyClass::setAnimal(Animal * a) { 
    animal = a; 
} 

Animal * a1 = new Lion; 
Animal * a2 = new Tiger; 

MyClass x1; 
x1.setAnimal(a1); 

MyClass x2; 
x2.setAnimal(a2); 
0

从设计的角度来看,是MyClass一个Animal的容器。在第一个例子中,你总是有一个Animal。在第二个例子中,你可能有或没有Animal

例如,如果你有一只鸟笼,你的第一个笼子里总是有一只鸟,它不能空着鸟,但第二个例子中你可能有或没有鸟。

这在数据库中称为Cardinality(0,1)。你可以把它想象成一个Animals的集合,带有一个或零个元素(即使你没有数组也很难)。

第二个方面是,在第一个例子中,您总是有相同的Animal,并且您无法自由传递它,并且Animal的生存期仅取决于容器。第二个例子允许将Animal移动到一个新的容器中或在两个不同的容器中具有相同的Animal,并将Animal与容器的寿命分开。

然后,用C++,你必须考虑内存分配和所有权,我们通常使用智能指针来释放动物。