我知道这可能是一个微不足道的问题,但我坚持不懈。我已经谷歌搜索了一段时间,但没有设法让它工作。
我有一个类,其中一个构造函数带有一些参数,其定义如下:
class MyClass {
private:
int _myInt;
double _myDouble;
std::vector<double> _myVector;
public:
MyClass(int myInt, double myDouble, std::vector<double> myVector);
MyClass(int myInt, double myDouble, otherVectorClass myVector);
int getMyInt();
double getMyDouble();
std::vector<double> getMyVector();
};
MyClass::MyClass(int myInt, double myDouble, std::vector<double> myVector) {
_myInt = myInt;
_myDouble = myDouble;
_myVector = myVector;
}
MyClass::MyClass(int myInt, double myDouble, otherVectorClass myVector) {
std::vector<double> tempVector = functionTransformingSTDVector(myVector);
MyClass(myInt, myDouble, tempVector);
}
// getters
int MyClass::getMyInt() { return _myInt; }
double MyClass::getMyDouble() { return _myDouble; }
std::vector<double> MyClass::getMyVector() { return _myVector; }
在另一种方法中,我使用以下代码实例化它:
std::vector<MyClass> myContainer;
int j = 0;
while(j<10) {
j++;
double d = 0.04;
otherVectorClass v = function_returning_vector(); // It works fine.
MyClass anInstance(j, d, v);
myContainer.push_back(anInstance);
}
我来找到我的错误,我调用第二个构造函数,一个将“vector”的特殊情况转换为std :: vector并调用第一个构造函数,但第一个构造函数上的私有变量按预期更改,但是不在原始构造函数调用上。
如果我改变第二个构造函数来转换向量,并直接赋值变量,那么一切正常。
如何从另一个构建函数中调用,以避免代码重复。
谢谢。
答案 0 :(得分:0)
您应该使用初始化而不是赋值。初始化是在创建时为变量提供值的地方;而不是让它采用默认值,然后像你现在一样分配一个值。
您可以使用委托构造函数:
MyClass::MyClass(int myInt, double myDouble, otherVectorClass myVector)
: MyClass(myInt, myDouble, functionTransforming(myVector))
{
}
虽然委托操作如此简单,但最好不要:
MyClass::MyClass(int myInt, double myDouble, otherVectorClass myVector)
: _myInt(myInt), _myDouble(myDouble), _myVector(functionTransformingSTDVector(myVector))
{
}
您可以而且应该对其他构造函数进行类似的更改,以使用初始化而不是赋值。 (另外,在该构造函数中使用std::move(myVector)
)。
答案 1 :(得分:0)
好吧,我已经明白了究竟发生了什么,我是c ++的新手,问题是由于构造函数的重载,更确切地说是委托重载的构造函数。
一旦我知道问题出在哪里,我就很快找到了解决方案。谢谢大家的建议和线索。
在这个link中,答案是根据我的情况调整代码:
public:
MyClass(int myInt, double myDouble, std::vector<double> myVector) { // code for the initialization };
MyClass(int myInt, double myDouble, otherVectorClass myVector) : MyClass(myInt, myDouble, functionTransformingSTDVector(myVector)) { // some code if needed after initialization };
我需要在调用'main'构造函数之前执行一些微积分,所以我试图找到是否可以从构造函数的主体进行调用,但在另一个link中,“ C ++ 11委托构造函数“说它无法完成,因为会发生的事情是在新实例的范围内创建临时对象,然后很快删除,这种行为不是我所期望的。
所以一种可能的解决方案是创建一个像'functionTransformingSTDVector(...)'这样的函数来执行微积分,就像上面发布的例子一样,或者创建一个初始化公共部分并从构造函数中调用它的函数: p>
private:
void construct(int myInt, double myDouble, std:vector<double> myVector) {
_myInt = myInt;
_myDouble = myDouble;
_myVector = myVector;
}
public:
MyClass(int myInt, double myDouble, std::vector<double> myVector) {
// Do the calculus needed
construct(myInt, myDouble, myVector); };
MyClass(int myInt, double myDouble, otherVectorClass myVector) {
// Do the calculus needed
construct(myInt, myDouble, tempVector); };
希望这对某人有帮助。