2010-04-24 30 views
2

我是C++初学者。我有下面的代码,重现不是我期望的。问题是为什么,分别。哪里不对。当然,你们大多数人乍一看就会看到它。struct constructor +函数参数

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++基础不是在complexnumber理论;-) 这将是很好,如果“添加”功能的确也接受一个真正的(没有额外的超载),而不是只复杂对象是可能的吗?

提前很多感谢
哎呀

+1

* huih *,我必须说,这个论坛非常快,非常棒。你们都非常乐于助人!再次感谢。 – OlimilOops 2010-04-24 16:52:43

+0

然后,不要忘记接受你的旧问题的答案。 – 2010-04-24 17:01:24

+0

请注意,复数类是公认的惯例,先命名实部,然后命名虚部。 – 2010-04-24 17:10:50

回答

4

你不能调用另一个类似的身体有一个构造函数:

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

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

你可以在构造函数或一些私人的方法,将通过构造函数调用使用默认参数

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++不支持委托构造,所以你不能从另一个调用一个conmstructor。

正如Neil Butterworth所说,目前您的Complexes类可能通过使用动态分配的vectorComplex而变得更加复杂。使用vector类型的对象而不是指针可能会更好。使用动态分配的向量,您应该提供一个destrutor,复制construtor和复制分配操作符,您目前不执行此操作以便向导delete,并在适当的点处管理它。如果不这样做,你的班级将(最好)泄漏内存。

0

当然,只需添加:

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

C++会调用构造函数为你创建复杂浮动。但是,具有许多具有相同名称的这些功能可能会导致含糊不清,所以不要过分溺爱。

我也观察你不需要动态创建复杂的向量 - 你应该尽可能避免在C++中动态创建对象。而实数数据类型的默认选择应该是双精度的,而不是浮点数。

0

添加以下方法到类配合物:

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

您还可以使用内置的复数std::complex类。它带有算术运算符,如+, - ,*,...和其他函数。这样可以安全地让你的数学计算正确。