c++ - 在 C++ 中初始化对象中的数组
问题描述
我目前正在学习 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;
};
但是考虑给你的类一个以 astd::initializer_list
作为输入的构造函数,然后让类在内部分配它自己的数组(只要确保遵循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;
}
推荐阅读
- python - 如何从网站中提取链接并使用python在网络抓取中提取其内容
- gem5 - 主机没有 libpng 库
- r - 如何计算 R 中最短和最长的时间间隔?
- java - 将 JSON 转换为 POJO 并在必填字段为空值的情况下抛出异常
- alert - Splunk:限制警报
- tfs - 将项目从 VS2013 添加到 AzureDevOps
- python - 我已经编写了这个 Python 代码来将 HTTP Post 发送到 NLP,然后保存结果
- python - 检查文件是否在子目录中?
- reactjs - 当 useRef Div 宽度改变时更新 UI
- oracle - 是否可以为会话设置默认 ORACLE dblink 并避免使用@dblink_name 后缀