我正在尝试创建一个重载构造函数,它将接受整数并使用 byteAdd 函数将它们相加。然而;每当我编译时,输出始终是默认构造函数,而不是两个重载构造函数的总和。我已经在 setValue() 函数中使用了clear函数,但是错误仍然存在。关于为什么问题仍然存在于我的代码中的任何线索?
#pragma once
#ifndef MATH
#define MATH
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using std::string;
using std::vector;
class Math {
private:
int num1{};
int bitsToInt() const;
public:
void setValue(int value);
int at(int index) const;
string toString() const;
int toInt() const;
struct Bits {
int value;
Bits(int v) : value(v) {}
};
vector<Bits>bits;
Math byteAdd(const Math& f);
//Constructor
Math();//Default constructor
Math(int val); //This is an overloaded constr
};
#endif // !MATH
//Math.cpp
#include <iostream>
#include <cstdlib>
#include "Math.h"
using namespace std;
//Default Math constructor
Math::Math() {
this->setValue(0);
}
//Overloaded Constructor
Math::Math(int val) {
this->setValue(val);
for (int i = 0; i < 8; ++i) {
this->bits.push_back(Bits{ (val >> i) & 1 });
}
}
void Math::setValue(int value) {
this->num1 = value;
for (int i = 0; i < 8; ++i) {
this->bits.push_back(Bits{ (value >> i) & 1 });
}
}
int Math::bitsToInt() const {
int val1 = 0;
for (int i = 0; i < 8; i++) {
val1 |= (bits[i].value << i);
}
return val1;
}
int Math::at(int index) const {
return bits[index].value;
}
std::string Math::toString() const {
std::string str;
for (int i = 7; i >= 0; --i) {
str += std::to_string(bits[i].value);
}
return str;
}
int Math::toInt() const {
return bitsToInt();
}
Math Math::byteAdd(const Math& f) {
Math tmp;
tmp.num1 = num1; // Assigning num1 of current object to num1 of tmp
int carry = 0;
for (int i = 0; i < 8; ++i) {
int s = bits[i].value + f.bits[i].value + carry; // Accessing bits of f
tmp.bits.push_back(Bits{ s % 2 }); // Using push_back to add new Bits
carry = s / 2;
}
return tmp;
}
//Main.cpp
#include <iostream>
#include "Math.h"
using namespace std;
int main() {
Math obj1, obj2, obj4, obj5(5), obj6(5);
Math obj3 = obj1.byteAdd(obj2);
Math obj7 = obj5.byteAdd(obj6);
cout << "Int: " << obj7.toInt() << endl;
cout << "String " << obj7.toString() << endl;
return 0;
}
我希望输出是 obj5(5) 和 obj6(5) 的总和,这将导致 10 和字符串输出 0001010。但是我得到 0,这是我运行时的初始 setValue程序。
您正在查看向量的错误元素。
您应该使用调试器逐行单步执行代码。然后你会在这里看到:
Math Math::byteAdd(const Math& f) {
Math tmp;
tmp.num1 = num1; // Assigning num1 of current object to num1 of tmp
int carry = 0;
for (int i = 0; i < 8; ++i) {
int s = bits[i].value + f.bits[i].value + carry; // Accessing bits of f
tmp.bits.push_back(Bits{ s % 2 }); // Using push_back to add new Bits
// ...
Math tmp
调用默认构造函数。默认构造函数调用 this->setValue(0);
。 setValue
将 8 个元素推入向量。然后在循环中将另外 8 个元素压入向量中。接下来的代码仅考虑前 8 个元素(包含 0
,包含正确值的接下来 8 个元素在推送后不会被访问)。
与
Math(int val)
类似的问题。它调用 setValue(val)
将 8 个元素推送到向量,然后在构造函数主体中将另外 8 个元素推送到向量。这个问题并没有那么严重,因为你推送了两次相同的元素。
当您总是需要 8 个元素时,不要使用向量。用
std::array<int,8>
替换向量,而不是推送元素,只需访问它们即可。这应该可以解决您的代码问题。
(注意:
Bits
只是一个int
。与使用普通的int
相比,它没有带来任何优势。)