【问题标题】:Creating a class with parameters in the constructor c++在构造函数c ++中创建一个带参数的类
【发布时间】:2017-04-04 20:52:39
【问题描述】:

我知道这可能是一个微不足道的问题,但我坚持下去。我用谷歌搜索了一段时间,但没有成功。

我有一个类和一个带有一些参数的构造函数,它的定义是这样的:

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

我来发现我的错误,我调用第二个构造函数,将“向量”的特殊情况转换为 std::vector 并调用第一个构造函数,但是第一个构造函数上的私有变量按预期改变,但是做不在原来的构造函数调用上。

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

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

谢谢。

【问题讨论】:

  • "因为 "anInstance" 已丢失所有值,并已被重置。" - 你怎么会知道这事?它被“重置”为什么值?
  • 可能您的默认复制构造函数设置不正确。提示:MyClass::MyClass(...) : _myInt(myInt), _myDouble(_myDouble), myVector(myVector) 是将这些链接起来的更简单方法。
  • @tadman 他不需要复制构造函数。
  • @NeilButterworth 够公平的。
  • 我会使用 MyClass::MyClass(...) : ..., _myVector(myVector) 而不是 MyClass::MyClass(...) : ..., _myVector(std::move(myVector))

标签: c++ class constructor


【解决方案1】:

您应该使用初始化而不是赋值。初始化是您在创建变量时为其提供值的地方;而不是让它取一个默认值,然后像你现在所做的那样稍后分配一个值。

您可以使用委托构造函数:

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))。

【讨论】:

  • 我是新手,为什么说我应该使用初始化而不是赋值?我通常倾向于使用一个私有函数“setDefault”,为所有属性分配一个默认值,尤其是当并非所有变量都在构造函数的参数中时……它可以帮助我在需要时重置所有属性。
【解决方案2】:

嗯,我已经明白到底发生了什么,我是 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 Delegating Constructors”说不能这样做,因为发生的是在新实例的范围内创建了一个临时对象,然后很快就删除了,这种行为不是我所期望的。

因此,一种可能的解决方案是创建一个类似“functionTransformingSTDVector(...)”的函数来执行演算,就像上面发布的示例一样,或者创建一个初始化公共部分的函数并从构造函数中调用它:

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

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2015-07-16
    • 1970-01-01
    • 2014-03-06
    • 2014-08-01
    • 2011-09-25
    相关资源
    最近更新 更多