在构造函数c ++中创建带参数的类

时间:2017-04-04 20:52:39

标签: c++ class constructor

我知道这可能是一个微不足道的问题,但我坚持不懈。我已经谷歌搜索了一段时间,但没有设法让它工作。

我有一个类,其中一个构造函数带有一些参数,其定义如下:

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并调用第一个构造函数,但第一个构造函数上的私有变量按预期更改,但是不在原始构造函数调用上。

如果我改变第二个构造函数来转换向量,并直接赋值变量,那么一切正常。

如何从另一个构建函数中调用,以避免代码重复。

谢谢。

2 个答案:

答案 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); };

希望这对某人有帮助。