struct构造函数+函数参数

时间:2010-04-24 16:17:01

标签: c++

我是C ++初学者。我有以下代码,reult不是我所期望的。问题是为什么,分别是。怎么了。当然,大多数人乍看之下都会看到它。

struct Complex {
    float imag;
    float real;
    Complex( float i, float r) {
        imag = i;
        real = r;
    }
    Complex( float r) {
        Complex(0, r);
    }
    std::string str() {
        std::ostringstream s;
        s << "imag: " << imag << " | real: " << real << std::endl;
        return s.str();
    }
};
class Complexes {
    std::vector<Complex> * _complexes;
public:
    Complexes(){
        _complexes = new std::vector<Complex>;
    }
    void Add( Complex elem ) {
        _complexes->push_back( elem ); 
    }
    std::string str( int index ) {
        std::ostringstream oss;
        Complex c = _complexes->at(index);
        oss << c.str();
        return oss.str();
    }
};
int main(){
    Complexes * cs = new Complexes();
    //cs->Add(123.4f);
    cs->Add(Complex(123.4f));
    std::cout << cs->str(0); return 0; }

现在我对c ++的基础知识感兴趣,而不是复杂数理论;-) 如果“添加”功能也接受一个真实的(没有额外的重载)而不仅仅是一个复杂对象,那么这可能会很好吗?

非常感谢提前祝贺 糟糕

5 个答案:

答案 0 :(得分:4)

你不能在另一个构造函数中调用一个构造函数:

Complex( float r) {
        Complex(0, r);
    }

在C ++中,它会创建一个Complex类的临时对象,它会立即被销毁。

您可以在构造函数中使用默认参数,也可以使用构造函数调用的一些私有方法

答案 1 :(得分:2)

Complex( float i, float r) {
    imag = i;
    real = r;
}
Complex( float r) {
    Complex(0, r);
}

这对构造函数可能不符合您的意图。

第二个构造函数的主体构造一个无名的临时Complex对象,然后丢弃它。成员realimag未被初始化。

最简单的解决方法是:

Complex( float r )
    : imag(0), real(r)
{
}

目前C ++不支持委托构造函数,因此您无法从另一个构建函数调用一个构造函数。

正如Neil Butterworth所评论的那样,目前你的Complexes类可能因使用动态分配的vector Complex而变得更加复杂。使用vector类型的对象而不是指针可能会更好。使用动态分配的向量,您应该提供一个destrutor,复制构造器和复制赋值运算符,这些运算符当前不用于delete向量并管理在适当的点复制它。如果不这样做,你的课将(充其量)泄漏记忆。

答案 2 :(得分:0)

当然,只需添加:

void Add( float  elem ) {
    _complexes->push_back( elem ); 
}

C ++将调用构造函数来从float创建Complex。但是,如果这些功能中的许多具有相同的名称,可能会导致含糊不清,所以不要过分。

我还观察到你不需要动态创建Complex的向量 - 你应该尽可能避免在C ++中动态创建对象。并且实数数据类型的默认选择应该是double,而不是float。

答案 3 :(得分:0)

将以下方法添加到Complexes类中:

class Complexes {
 // ...
 void Add( float real ) {
    _complexes->push_back( Complex(real) ); 
 }
 // ...
}

答案 4 :(得分:0)

您还可以将内置类std::complex用于复数。它带有算术运算符,如+, - ,*,...和其他函数。这样可以帮助您在使数学运算正确方面遇到麻烦。