gpt4 book ai didi

c++ - 在C++中初始化对象中的数组

转载 作者:行者123 更新时间:2023-12-02 09:47:56 25 4
gpt4 key购买 nike

我目前正在学习C++,并且创建了一个数组类。
问题:我无法使用构造函数初始化对象中的数组。
我需要写什么来初始化该成员? (我确定语法有误。)
码:ary.h:

template<typename T_datatype>
class ary {

private:
T_datatype* T_dataptr;

public:
ary<T_datatype>(T_datatype* T_ptr) : T_dataptr(T_ptr) {}
};
main.cpp:
#include "ary.h"

int main()
{
ary<int> array_int = {2, 3, 4}; //is it something like that?...

return 0;
}

最佳答案

您实现的构造函数期望int*指针作为输入,但是{2, 3, 4}不会衰减为int*,因此,不,对于目前为止已实现的类,您显示的语法将不起作用。
如果您知道编译时的确切数组大小,则可以使用 std::array 代替:

#include <array>

template<typename T, size_t N>
struct ary {
std::array<T, N> data;
...
};
#include "ary.h"

int main()
{
ary<int, 3> array_int1{2, 3, 4};

ary<int, 3> array_int2 = {2, 3, 4};

ary<int, 3> array_int3 = {{2, 3, 4}};

return 0;
}
否则,如果您确实希望 ary具有指向某些数组数据的指针,则可以先声明一个实际数组,然后将其传递给构造函数,例如:
template<typename T>
class ary {
private:
T *dataptr;
...

public:
ary(T* ptr) : dataptr(ptr) {}
...
};
#include "ary.h"

int main()
{
int data[] = {2, 3, 4};
ary<int> array_int(data);
...

return 0;
};
但是请考虑为您的类提供一个构造函数,该构造函数将 std::initializer_list 作为输入,然后让该类在内部分配自己的数组(只需确保遵循 Rule of 3/5/0即可),例如:
#include <algorithm>
#include <utility>

template<typename T>
class ary {
private:
T *dataptr = nullptr;
int datasize = 0;

public:
ary() = default;

ary(const ary &src)
: ary()
{
if (src.dataptr && src.datasize > 0)
{
dataptr = new T[size];
datasize = src.datasize;
std::copy(src.dataptr, src.dataptr+src.datasize, dataptr);
}
}

ary(ary &&src)
: dataptr(src.dataptr), datasize(src.datasize)
{
src.dataptr = nullptr;
src.datasize = 0;
}

ary(T* ptr, int size)
: dataptr(new T[size]), datasize(size)
{
std::copy(ptr, ptr+size, dataptr);
}

ary(std::initializer_list<T> l)
: dataptr(new T[l.size()]), datasize(l.size())
{
std::copy(l.begin(), l.end(), dataptr);
}

~ary()
{
delete[] dataptr;
}

ary& operator=(ary rhs)
{
std::swap(dataptr, rhs.dataptr);
std::swap(datasize, rhs.datasize);
return *this;
}

...
};
#include "ary.h"

int main()
{
ary<int> array_int1;

ary<int> array_int2 = {2, 3, 4};

int data[] = {2, 3, 4};
ary<int> array_int3{data, 3};

ary<int> array_int4{array_int2};

ary<int> array_int5{std::move(array_int3)};

...

return 0;
}
更好的选择是改为使用 std::vector ,并让它为您完成所有工作,例如:
#include <vector>

template<typename T>
class ary {
private:
std::vector<T> data;

public:
ary() = default;

// the copy/move constructors, copy/move assignment operators,
// and destructor will be implicitly generated for you...

ary(T* ptr, int size) : data(ptr, size) {}
ary(std::initializer_list<T> l) : data(l) {}

...
};
#include "ary.h"

int main()
{
ary<int> array_int1;

ary<int> array_int2 = {2, 3, 4};

int data[] = {2, 3, 4};
ary<int> array_int3{data, 3};

ary<int> array_int4{array_int2};

ary<int> array_int5{std::move(array_int3)};

...

return 0;
}

关于c++ - 在C++中初始化对象中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63513644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com