我的模板类返回错误的数据

时间:2016-06-05 18:55:19

标签: c++ templates

因此,当我运行下面编写的程序时,打印出来的是

What is passed in 4 7
What is inside -1138187264 32566
-1138187264 + 32566 = -1138154698
1
0

我需要它来保持4和7而不是它当前拥有的垃圾数。我不认为我错误地传递了我的价值观。我试图取消引用它们,但这也没有用。我只想让我的班级计算器保存2个int数字。但由于某种原因,当我传入数字时,它无法识别它们?我不太确定这里发生了什么。

这是我的主要课程

#include <stdlib.h>
#include <iostream>
#include "Calculator.h"
#include "Calculator.cpp"
using namespace std;

class Arithmetic {
private:
    int intData;
public:
    Arithmetic() {
        intData = 0;
    }
    Arithmetic(int i) {
        intData = i;
    }
    void intOperations(Arithmetic obj) {
        cout << "What is passed in " << intData << " " << obj.intData << endl;
        Calculator<int> cint(intData, obj.intData);
        cout << "What is inside " << cint.getValue1() << " " << cint.getValue2() << endl;
        printOperations(cint);
    }
};

int main(){
    // Create 1st object
    int int1 = 4;
    Arithmetic arith1(int1);
    // Create 2nd object
    int int2 = 7;
    Arithmetic arith2(int2);
    arith1.intOperations(arith2);

}

这是我的calc.h标题

#ifndef CALCULATOR_H
#define CALCULATOR_H

template <class T>
class Calculator {
private:
    T value1;
    T value2;
public:
    Calculator();
    Calculator(T value1, T value2);
    T getValue1();
    T getValue2();
    T getSum();
    int getLogicalAND();
    bool isGreater();
};

#endif

这是我的calc.cpp类

#include "calc.h"
template <class T>
Calculator<T>::Calculator(){
    value1 = T();
    value2 = T();
}

template <class T>
Calculator<T>::Calculator(T value1, T value2) {
    value1 = value1;
    value2 = value2;
}

template <class T>
T Calculator<T>::getValue1() {
    return value1;
}

template <class T>
T Calculator<T>::getValue2() {
    return value2;
}

2 个答案:

答案 0 :(得分:3)

当你写:

template <class T>
Calculator<T>::Calculator(T value1, T value2) {
    value1 = value1;
    value2 = value2;
}

你正在混合函数参数和类属性....在编译器优化之后(因为当你写value1 = value1; ....你实际上什么都没做...),你得到的东西相当于:

template <class T>
Calculator<T>::Calculator(T value1, T value2) {
}

所以value1value2未初始化......这是垃圾。

你需要这样做:

template <class T>
Calculator<T>::Calculator(T value1, T value2) {
    this->value1 = value1;
    this->value2 = value2;
}

更好的是,使用初始化列表:

template <class T>
Calculator<T>::Calculator(T value1, T value2) : 
    value1(value1), 
    value2(value2) 
{
}

答案 1 :(得分:1)

此:

template <class T>
Calculator<T>::Calculator(T value1, T value2) {
    value1 = value1;
    value2 = value2;
}

没有做你认为的事情。你至少应该写:

this->value1 = value1;

或甚至更好地为参数命名。