c++ - 帮助理解函数和类模板之间的差异

标签 c++ arrays templates stdvector

我正在尝试实现一个 C++ 程序,该程序在给定元素列表的情况下打印出列表中的唯一元素。

我对 C 的了解比对 C++ 的了解要多得多,但我现在才开始实际上(编码)C++。

我只阅读了 C++ 概念什么是模板,我对函数模板很满意,但我刚刚阅读了类模板,我想我对在哪里使用哪个模板感到困惑,因为它适用于下面的场景。

这是我到目前为止所写的内容(*请注意,函数 isUnique 应该做其他事情,但我现在只在其中编写可验证的操作):

cppArrays.h

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;

template <class T> class cpparray{
private:
    int size;
    vector<T> elems;
public:
    cpparray(int);
    ~ cpparray();
    int isUnique(T arr);
};


template <class T> cpparray<T>::cpparray(int size)
{
    vector<T> elems(size);
    cout << "Object created with size " << elems.size()<< "\n"<< endl;
}
template <class T> cpparray<T>::~cpparray()
{
    cout << "Object del\n" << endl;
}

template <class T> int cpparray<T>::isUnique(T arr)
{
    return arr.size();
}

cppArrays.cc

#include "cppArrays.h"

int main()
{
    cpparray<int> a(10) ;
    //a.push_back(1);
    //a.push_back(2);
    //cout << a.size() << a.begin() << a.end() << endl;
    int b = isUnique(a);
    return 0;
}

详细信息:

[1] 我正在尝试使用模板,因为我希望我的 vector 能够用任何数据类型 - char/float/int 进行实例化。

[2] 我意识到在使用类模板时,通过调用

cpparray<int>a(10);

我最终声明了一个类型为 Integer 的类“cpparray”的对象 a。它是否正确? 如果是,那么 a.push_back(1) 将不起作用,因为它不引用成员变量而是引用对象本身,因此这是可以理解的我会得到一个编译时错误说 cpparray 中没有名为 push_back 的成员

但这让我更难了

[1] 了解何时使用 class 模板而不是 function 模板,

[2] 根据我的目标,如何在模板类中初始化这个 vector 并使用它?

最佳答案

你的构造函数应该使用初始化列表来初始化成员,

像这样:

template <class T> array<T>::array(int sz) :  size(sz), elems(sz)
{
    cout << "Object created with size " << elems.size()<< "\n"<< endl;
}

您所做的是在构造函数中将 vector 声明为局部 vector ,将其初始化为大小,并在 block 末尾销毁局部 vector 。

关于c++ - 帮助理解函数和类模板之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38297250/

相关文章:

c++ - 如何在Qt中绘制一个 'x'?

javascript - 按属性对对象数组进行排序以匹配提供的列表

php - array_push() 和 array_merge() 有什么区别?

c++ - 如果推导其中一个模板参数,是否可以不指定所有模板参数?

C++虚拟模板函数

c++ - 错误/usr/include/string.h :652:42: error: ‘memcpy’ was not declared in this scope while building caffe

c++ - 为什么 `std::reference_wrapper` 在 c++17 中弃用并在 c++20 中删除?

c++ - C++中的引用指针

javascript - 平滑数组的值

c++ - 这是从容器中获取随机元素的 OK 范围方法吗?