重载函数未输出正确答案

问题描述 投票:0回答:1

我正在尝试创建一个重载构造函数,它将接受整数并使用 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程序。

Output of the program with the overloaded Functions

c++ error-handling constructor addition constructor-overloading
1个回答
0
投票

您正在查看向量的错误元素。

您应该使用调试器逐行单步执行代码。然后你会在这里看到:

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
相比,它没有带来任何优势。)

© www.soinside.com 2019 - 2024. All rights reserved.