数组模板和内置数组类型之间有区别吗?

时间:2014-09-18 07:14:28

标签: c++ arrays compiler-errors

我有一个我编写的C ++类叫做#34;加密"。该类有几个函数,包括一个构造函数,它与一个数组数据成员交互,并接受一个数组作为参数。根据我读过的书,最好使用数组模板并创建如下所示的数组,而不是使用"内置"数组符号。

我的书如何创建数组:

std::array <int, 8> digits;

我过去如何创建数组:

int digits[8];

我将数组定义(我的第一个示例)包含为我的类的私有数据成员。我包含了一个构造函数,它接受一个数组并使用该数组在我的私有数据成员数组中存储数据。我的构造函数原型看起来像这样:

Encrypt(std::array <int, 8>);

问题是,我的老师提供了一个.cpp驱动文件,它将数组传递给我的构造函数。他宣布他的阵列的方式如下:

int Long[]={1,2,3,4,5,6,7,8};

所以,他使用旧的&#34;内置&#34;数组表示法。他通过创建一个对象并提供数组基地来调用我的构造函数,如下所示:

Encrypt objName(Long);

当我尝试编译程序时,出现以下错误:

error C2664: 'Encrypt::Encrypt(const Encrypt &)' : cannot convert argument 1 from 'int[8]' to '_int64'

所以我的猜测是使用内置数组表示法创建的数组与从模板构造的数组不同。我不确定我是否遗漏了某些东西,因为我不明白为什么我的老师会使用与该书所说的内容不兼容的阵列(这是一个在线课程,所以我从书中自学。)

这是我的&#34; MCVE&#34;根据要求 - 如果我遗漏了一些内容,请评论 - 我试图将我的课程浓缩为仅重要的代码。

我的.h文件中的内容:

class Encrypt
{
public:
   Encrypt(long long int);             // class constructor to store last 4 digits of input
   Encrypt(std::array <int, 8>);       // second class constructor to store first 4 digits
private:
    std::array <int, 8> digits;  // data member array to hold digit inputs and encrypted data
};

我的.cpp类实现文件的内容(剥离了不相关的代码):

#include "Encrypt.h"
#include <iostream>
#include <array>

using namespace std;
// begin first constructor - accepts int input and stores last for digits
Encrypt::Encrypt(long long int input)  // constructor 1 - encrypts and stores data
{
   // removed code to store int argument into private data member array
} // end first constructor

// begin constructor 2 - accepts array and stores first 4 digits
Encrypt::Encrypt(array <int, 8> input)       
{
  // removed code that performs various operations on argument array and
  // private data member array
} // end of second constructor

调用我的构造函数的代码,由我的老师在.cpp&#34; driver&#34;中提供。文件:

#include "Encrypt.h" // include definition of class Encrypt
#include "Decrypt.h" // include definition of class Decrypt
#include <iostream>
#include <cstdlib>
using std::cin;
using std::cout;
using std::endl;
using std::atoi;


int main()
{  int Long[]={1,2,3,4,5,6,7,8};
int Negative[]={-8,7,6,5,4,3,2,1};
Encrypt eapp1(0), eapp2(40), eapp3(4560), eapp4(6145698),eapp5(-6), 
    eapp6(Long), eapp7(Negative); // create Encrypt objects

// more code to test program

return 0;
} // end of main

2 个答案:

答案 0 :(得分:1)

你不能自由地交换C风格的数组和<array>模板,它们是不同的东西。

但您可以使用data()成员函数访问基础数组:

void Encrypt(int* a)
{
    // ....
}

int main(void)
{
    std::array <int, 8> digits;
    Encrypt(digits.data());

    int digits2[] = {1,2,3,4,5,6,7,8};
    Encrypt(digits2);
}

答案 1 :(得分:0)

使用强类型时,您可以使用以下内容:

class Encrypt
{
public:
    Encrypt(const std::array<int, 8>& a) : mArray(a) {}
#ifdef OPTION1
    Encrypt(const int (&a)[8]) : mArray({a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]}) {}
#else
    Encrypt(const int (&a)[8]) { std::copy(std::begin(a), std::end(a), std::begin(mArray)); }
#endif

private:
    std::array<int, 8> mArray;
};

(你可以看出为什么std::array比原始数组更受欢迎。