[英]Can someone please tell whats wrong with this c++ code
#include <iostream>
using namespace std;
class Complex{
private:
int a,b;
public:
void set_data(int x,int y){
a=x,b=y;
}
void show_data(){
cout<<a<<" "<<b<<endl;
}
};
Complex add(Complex c, Complex d){
Complex temp;
int a = c.a+c.b;
int b = d.a+d.b;
temp.set_data(a,b);
return temp;
};
int main()
{
Complex c1,c2,c3;
c1.set_data(2,3);
c2.set_data(4,5);
c3 = add(c1,c2);
c3.show_data();
return 0;
}
想知道为什么 add 函数不工作,好像我写 c1.add(c2) 并在类中定义函数然后它工作得很好
“a”和“b”被声明为私有。 你不能从课堂外访问它。 您需要将其公开或提供 getter 或将其移至班级内部。
正如其他人指出的那样,成员变量“a”和“b”是私有的,因此不能从类外部访问。 另外,请注意您的“添加”函数在数学上可能不正确。 如果您想将两个复数相加,您可能需要这样写:
int a = ca + da;
int b = cb + db;
我假设“a”是实部,“b”是虚部
#include <iostream> using namespace std; class Complex{ private: int a,b; public: void set_data(int x,int y){ a=x,b=y; } void show_data(){ cout<<a<<" "<<b<<endl; } int getA(){ return a; } int getB(){ return b; } }; Complex add(Complex c, Complex d){ Complex temp; int a = c.getA()+c.getB(); int b = d.getA()+d.getB(); temp.set_data(a,b); return temp; } int main() { Complex c1,c2,c3; c1.set_data(2,3); c2.set_data(4,5); c3 = add(c1,c2); c3.show_data(); return 0; }
#include <iostream> using namespace std; class Complex{ public: int a,b; public: void set_data(int x,int y){ a=x,b=y; } void show_data(){ cout<<a<<" "<<b<<endl; } }; Complex add(Complex c, Complex d){ Complex temp; int a = c.a+cb; int b = d.a+db; temp.set_data(a,b); return temp; }; int main() { Complex c1,c2,c3; c1.set_data(2,3); c2.set_data(4,5); c3 = add(c1,c2); c3.show_data(); return 0; }
所以,这里有很多东西要讨论,而且有点困难,因为很难知道你可以使用什么。 至少,我试图从我的课程中删除这个概念。
您的类缺少任何构造函数。 仅仅依靠 setter 是不好的做法。 构造函数是初始化对象的正确方式,并且比默认的初始化+setter 更高效。
你过度使用逗号运算符并没有真正的好处。 它只会混淆可读性。
您的add()
函数试图访问私有数据,这是一个很大的禁忌。 如果任何免费功能可以随心所欲地访问私人数据,那将违背目的。 在类内部实现该函数工作正常的原因是因为作为类成员函数,它可以访问私有部分。 要么使其成为类成员函数,要么为您的数据添加 getter。
下面的示例添加了构造函数,在它们适合的地方用运算符重载替换函数,并进行了一些其他“更好”的实践更改。 它还包括 C++17 中可用的功能。
当我帮助解决这样的家庭作业问题时,我倾向于使用一些可能尚未讨论过的东西; 它有助于防止复制/粘贴不诚实。 但我相信它仍然有助于看到逻辑发挥作用。
#include <iostream>
#include <string>
#include <tuple>
class Complex {
public:
Complex() = default;
Complex(int r, int i) : m_real(r), m_imaginary(i) {}
auto get_data() const { return std::make_tuple(m_real, m_imaginary); }
void set_data(int x, int y) {
m_real = x;
m_imaginary = y;
}
private:
int m_real = 0;
int m_imaginary = 0;
};
Complex operator+(const Complex& lhs, const Complex& rhs) {
auto [leftReal, leftImaginary] = lhs.get_data(); // C++17 feature
auto [rightReal, rightImaginary] = rhs.get_data();
return Complex(leftReal + rightReal, leftImaginary + rightImaginary);
}
// No newline printed here because no other Standard type does that
std::ostream& operator<<(std::ostream& sout, const Complex& obj) {
auto [real, imaginary] = obj.get_data();
// If you care about setw() interacting with your output, this intermediate
// step matters
std::string val =
std::to_string(real) + " + " + std::to_string(imaginary) + "i";
return sout << val;
}
int main() {
Complex c1(2, 3);
Complex c2(4, 5);
Complex c3 = c1 + c2;
std::cout << c3 << '\n';
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.