给定一个有两个需要共享变量的方法的类,在它们之间传递/共享该变量的最佳方法是什么?假设在类中的其他任何地方都不需要该变量。如果该变量是STL容器,这会改变什么吗?
我正在考虑以下三个选项:
在一个方法中实例化变量并通过指针返回它,然后在另一个方法中将其删除。
class MyClass
{
public:
std::vector<int>* method1();
void method2();
};
std::vector<int>* MyClass::method1()
{
std::vector<int> *my_int_vector = new std::vector<int>;
//manipulate the vector in some way
return my_int_vector;
}
void MyClass::method2()
{
std::vector<int> *myvector;
myvector = this->method1();
//manipulate the vector in some way
delete myvector;
}
这将新方法和删除方法分开,这似乎是乞求出错。
或者,您可以使用类私有成员属性来保存变量。
class MyClass
{
private:
std::vector<int> myvector;
public:
void method1();
void method2();
};
void MyClass::method1()
{
//manipulate this->myvector
}
void MyClass::method2()
{
this->method1();
//manipulate this->myvector
}
这会不必要地将变量暴露给类的其余部分。
最后,您可以在一个方法中创建一个对象,并通过引用传递它。
class MyClass
{
public:
void method1(std::vector<int> *my_int_vector);
void method2();
};
void MyClass::method1(std::vector<int> *my_int_vector)
{
//manipulate my_int_vector in some way
}
void MyClass::method2()
{
std::vector<int> myvector;
this->method1(&myvector);
//manipulate myvector in some way
}
对我而言,这似乎是最佳解决方案,因为您没有调用new或delete,并且该变量不适用于整个班级。
我对我的选择的评估是否正确并且我错过了其他更好的选择吗?
答案 0 :(得分:1)
首选方法是将该变量设为 ,如果 将其作为参数从一个函数传递给另一个函数是不可能的。
所以是的,第三种选择可能是最好的。
如果该变量是STL容器,这会改变什么吗?
没有。 C ++标准库中的容器也是普通对象。
关于第二个选项:
这将新方法和删除方法分开,这似乎是乞求出错。
是。首先使用原始new
和delete
已经在乞求麻烦了。 当你不必动时,不要动态分配。当你这样做时,请使用智能指针。
因此,在这种情况下,您可以简单地按值传递向量。或者,如果该函数将被调用很多,那么可能生成向量static
并通过引用返回它。
你提到了你的第二个选择
不必要地将变量暴露给类的其余部分。
如果那是真的问题,那么你的课程可能太大和/或试图做太多。您应该考虑将类拆分为具有明确,最小化和明确定义的职责的较小类(SRP)。
这给我们带来了第四个选项,在你的情况下可能会或者可能没有意义:将向量存储在它自己的类中,并使这两个方法成为该类的成员。然后将该类存储为MyClass
的成员。
答案 1 :(得分:0)
我说 - 让一个函数创建对象并通过引用传递给其他方法。
对我而言,这似乎是最好的解决方案,因为你没有打电话给新的或 删除并且变量不可用于整个班级。
那么,如果您使用new
创建对象,会有什么不同?内存管理的相同问题与其他技术一起出现。
无论如何,你的出发点是在堆栈上声明对象。尽量保持对象堆栈分配,如果它是在堆上 - 选择智能指针,以确保没有发生内存泄漏。
为类中的对象创建一个占位符作为静态:
1)使你的班级被不相关的物体污染
2)使你的课程不是线程安全的