繁体   English   中英

有人可以告诉这个 C++ 代码有什么问题吗

[英]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”是虚部

  1. 由于类变量“a”和“b”是私有的,您需要为它们编写 getter 函数。 示例代码如下:
 #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; }
  1. 或者公开变量以从任何地方直接访问。 示例如下:
 #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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM