如何使用 C++ 模板实现 int、string、float 和 date 对象的数组?

Posted

技术标签:

【中文标题】如何使用 C++ 模板实现 int、string、float 和 date 对象的数组?【英文标题】:How to implement array of int, string, float and date object using c++ Template? 【发布时间】:2019-07-22 23:23:03 【问题描述】:

编写一个程序,使用类模板创建和显示整数、浮点数、字符串和 Date 对象的数组(其中 Date 对象使用整数月、日、年属性对日期建模)。

我能够显示整数、浮点数和字符串的数组,但在使用 Date 对象的数组时遇到了问题。我不确定如何从模板类调用打印日期函数(在 Date 类中)。

template< typename T > 
class Myarray 

private:
    int size;
    T *myarray;
public:
    // constructor with user pre-defined size
    Myarray(int s , T* array) 
        size = s;
        myarray = new T[size];

        for (size_t i = 0; i < size; ++i)
        
            myarray[i] = array[i]; // Copy into object
        

    
    // calss array member function to set element of myarray 
    // with type T values
    void setArray(int elem, T val) 
        myarray[elem] = val;
    

    // for loop to display all elements of an array
    void getArray() 
        for (int j = 0; j < size; j++) 
            // typeid will retriev a type for each value
            cout << setw(7) << j << setw(13) << myarray[j] <<endl;
        
        cout << "-----------------------------" << endl;
    

;

class Date 
private:
    int day;
    int month;
    int year;
public:
    Date() 
        day = month = year = 0;
    
    Date(int day, int month, int year) 
        this->day = day;
        this->month = month;
        this->year = year;

    

    void print_date(void) 
        cout << day << "/" << month << "/" << year << endl;
    


;

int main()

    // instantiate int_array object of class array<int> with size 2
    int array1[] =  1,2,3,4,5 ;
    Myarray< int > int_array(5,array1);
    int_array.getArray();


    float array2[] =  1.012, 2.324, 3.141, 4.221, 5.327 ;
    Myarray<float> b(5, array2);
    b.getArray();


    std::string array3[] =  "Ch1","Ch2","Ch3","Ch4","Ch5" ;
    Myarray<std::string> c(5, array3);
    c.getArray();


    Date array4[] =  Date(10, 18, 2019), Date(1, 01, 2019), Date(7, 04, 2019),
                    Date(12, 31, 2019), Date(12, 25, 2019) ;
    Myarray<Date> d(5, array4);
    d.getArray();



    return 0;

收到错误消息:

Error   C2679   binary '<<': no operator found which takes a right-hand operand of type 'Date'

【问题讨论】:

【参考方案1】:

问题出在您的getArray 函数中,该函数在myarray 上调用&lt;&lt;T 类型为:

cout << setw(7) << j << setw(13) << myarray[j] <<endl;

在这里,它期望myarray[j] 可以用operator&lt;&lt; 调用,这对于intfloatstd::string 是正确的,但是您的Date 类不提供operator&lt;&lt; 来使用,它怎么知道它应该如何输出?它不会知道打电话给print_date。相反,您应该在Date 中提供一个operator&lt;&lt;

friend std::ostream& operator<<(std::ostream& oss, const Date& d)

    oss << d.day << "/" << d.month << "/" << d.year << "\n";
    return oss;

现在您可以编写如下内容:

Date d;
std::cout << d;

同样,您的MyArray 类也可以使用它。

【讨论】:

以上是关于如何使用 C++ 模板实现 int、string、float 和 date 对象的数组?的主要内容,如果未能解决你的问题,请参考以下文章

CString与string的区别

C++ 函数模板

<c++> 四模板初阶

C++模板初阶

C++模板初阶

如何模板化一个接受模板化参数并在 C++ 中对其应用模板化函数的函数?