- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为学校做一个项目,它需要复制构造函数、析构函数等。当我使用复制构造函数时抛出一个错误,提示数组为空,我认为复制构造函数不工作。
当我删除复制构造函数时,程序可以运行,这意味着问题可能发生在该函数中。
template<class T>
class DynArray {
public:
DynArray<T>(){
ptr = new T[Capacity];
this->Capacity = 2;
this->Size = 0;
}
DynArray<T>(T n) {
ptr = new T[Capacity];
this->Capacity = n;
this->Size = 0;
}
DynArray<T>(const DynArray& orig) {
cout << "Copy" << endl;
ptr = new T[Size];
*ptr = *(orig.ptr);
}
DynArray<T>& operator=(const DynArray<T>& orig) {
if(this != &orig) {
delete[] ptr;
ptr = new T[Size];
*ptr = *(orig.ptr);
}
return *this;
}
void push_back(const T& n) {
if (Size >= Capacity) {
adjust(Capacity * 2);
}
ptr[Size] = n;
Size++;
}
void adjust(T a) {
cout << "grow" << endl;
T* arr = new T[a];
for (int i = 0; i < Capacity; ++i) {
arr[i] = ptr[i];
}
Capacity = a;
ptr = arr;
}
T& back() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[Size - 1];
}
T& front() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[0];
}
private:
T* ptr = nullptr;
int Capacity;
int Size;
主要内容:
#include <iostream>
#include "dynarray.h"
using namespace std;
int main( )
{
const char START = 'A';
const int MAX = 12;
// create a vector of chars
DynArray<char> vectD;
// push some values into the vector
for (int i = 0; i < MAX; i++)
{
vectD.push_back(START + i);
}
// remove the last element
vectD.pop_back();
// add another value
vectD.push_back('Z');
// test memory management
DynArray<char> vectD2 = vectD;
// display the contents
cout << "\n[";
for (int i = 0; i < vectD2.size() - 1; i++)
{
cout << vectD2.at(i) << ", ";
}
cout << "..., " << vectD2.back() << "]\n";
DynArray<char> vectD3;
vectD3 = vectD2;
cout << "\n[";
for (int i = 0; i < vectD3.size() - 1; i++)
{
cout << vectD3.at(i) << ", ";
}
cout << "..., " << vectD3.back() << "]\n";
vectD3.front() = '{';
vectD3.back() = '}';
cout << vectD3.front();
for (int i = 1; i < vectD3.size() - 2; i++)
{
cout << vectD3.at(i) << ", ";
}
cout << vectD3.at(vectD3.size()-2) << vectD3.back() << endl;
}
稍后在我的代码中,如果 Size == 0,我将其设置为抛出 runtime_error,它确实抛出错误,表示数组为空。复制构造函数是否正确复制? Main 不能更改,它是教授给的。
更新:我更改了复制构造函数以复制数组的所有元素,但运行时错误仍然返回说数组为空。
template<class T>
class DynArray {
public:
DynArray<T>(){
ptr = new T[Capacity];
this->Capacity = 2;
this->Size = 0;
}
DynArray<T>(T n) {
ptr = new T[Capacity];
this->Capacity = n;
this->Size = 0;
}
DynArray<T>(const DynArray& orig) {
cout << "Copy" << endl;
ptr = new T[Size];
for (int i = 0; i < Size; i++) {
ptr[i] = orig.ptr[i];
}
}
DynArray<T>& operator=(const DynArray<T>& orig) {
if(this != &orig) {
delete[] ptr;
ptr = new T[Size];
for (int i = 0; i < Size; i++) {
ptr[i] = orig.ptr[i];
}
}
return *this;
}
void push_back(const T& n) {
if (Size >= Capacity) {
adjust(Capacity * 2);
}
ptr[Size] = n;
Size++;
}
void adjust(T a) {
cout << "grow" << endl;
T* arr = new T[a];
for (int i = 0; i < Capacity; ++i) {
arr[i] = ptr[i];
}
Capacity = a;
ptr = arr;
}
T& back() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[Size - 1];
}
T& front() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[0];
}
private:
T* ptr = nullptr;
int Capacity;
int Size;
最佳答案
你的课上有不少错误。
在初始化Capacity
之前,默认构造函数使用Capacity
分配数组。
您的保留构造函数声明错误。它的输入参数应该是 int
而不是 T
。并且它会遇到与默认构造函数相同的 Capacity
错误。
您的复制构造函数也遇到了同样的初始化错误,只是 Size
代替了。而且它根本不执行深拷贝。它只是将 ptr
指针从一个类实例复制到另一个类实例,而不考虑所指向的内容。与您的复制赋值运算符相同。
您的 adjust()
方法也被声明为错误,它正在泄漏内存。
话虽如此,请尝试更像这样的方法:
#include <algorithm>
#include <utility>
template<class T>
class DynArray
{
public:
DynArray(int n = 2)
: ptr(new T[n]), Capacity(n), Size(0)
{
}
DynArray(const DynArray& orig)
: DynArray(orig.Size)
{
std::cout << "Copy" << std::endl;
std::copy(orig.ptr, orig.ptr + orig.Size, ptr);
Size = orig.Size;
}
DynArray(DynArray&& orig)
: ptr(nullptr), Size(0), Capacity(0)
{
orig.swap(*this);
}
~DynArray()
{
delete[] ptr;
}
DynArray& operator=(const DynArray& orig)
{
if (this != &orig) {
DynArray(orig).swap(*this);
}
return *this;
}
DynArray& operator=(DynArray&& orig)
{
DynArray(std::move(orig)).swap(*this);
return *this;
}
void swap(DynArray &other)
{
std::swap(other.ptr, ptr);
std::swap(other.Capacity, Capacity);
std::swap(other.Size, Size);
}
void push_back(const T& n)
{
if (Size >= Capacity) {
grow();
}
ptr[Size] = n;
++Size;
}
void pop_back()
{
if (Size <= 0) {
throw std::runtime_error("Array is empty");
}
ptr[Size - 1] = T();
--Size;
}
T& front()
{
if (Size <= 0) {
throw std::runtime_error("Array is empty");
}
return ptr[0];
}
T& back()
{
if (Size <= 0) {
throw std::runtime_error("Array is empty");
}
return ptr[Size - 1];
}
T& at(int i)
{
if ((i < 0) || (i >= Size)) {
throw std::out_of_range("Index out of range");
}
return ptr[i];
}
T& operator[](int i)
{
return ptr[i];
}
int size() const {
return Size;
}
int capacity() const {
return Capacity;
}
private:
T* ptr = nullptr;
int Capacity = 0;
int Size = 0;
void grow()
{
std::cout << "grow" << std::endl;
DynArray newArr(Capacity * 2);
std::copy(ptr, ptr + Size, newArr.ptr);
newArr.Size = Size;
newArr.swap(*this);
}
};
然后,你应该考虑扔掉所有这些,只使用 std::vector
相反,它会为您处理所有这些细节:
#include <vector>
template<class T>
class DynArray
{
public:
DynArray(int n = 2)
{
vec.reserve(n);
}
void push_back(const T& n)
{
vec.push_back(n);
}
void pop_back()
{
vec.pop_back();
}
T& front()
{
return vec.front();
}
T& back()
{
return vec.back();
}
T& at(int i)
{
return vec.at(i);
}
T& operator[](int i)
{
return vec[i];
}
int size() const {
return vec.size();
}
int capacity() const {
return vec.capacity();
}
private:
std::vector<T> vec;
};
关于c++ - 复制构造函数不是深度复制,错误返回数组为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55874108/
我正在编写一个应用程序,允许用户创建一个“问卷”,然后向其中添加问题。我正在使用核心数据来存储信息。我创建了一个问卷实体,并与问题实体建立了“一对多”关系。我的问题是,如果要允许用户复制(复制)整个调
有没有办法复制或复制 SharedPreference?或者我需要从一个变量中获取每个变量,然后将它们放入另一个变量中吗? 最佳答案 尝试这样的事情: //sp1 is the shared pref
下面的(A)和(B)有区别吗? (假设 NON ARC,如果重要的话) // --- (A) --- @interface Zoo : NSObject{} @property (copy) Dog
我正在尝试将 mysql SELECT 查询保存到文件中,如下所示: $result = mysqli_query($db,$sql); $out = fopen('tmp/csv.csv', 'w'
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
我在 Source 文件夹中有一个 Active wave 录音 wave-file.wav。我需要使用新名称 wave-file-copy.wav 将此文件复制到 Destination 文件夹。
在使用 GNU Autotools 构建的项目中,我有一个脚本需要通过 make 修改以包含安装路径。这是一个小例子: configure.ac: AC_INIT(foobar, 1.0) AC_PR
我想将 SQL 的行复制到同一个表中。但是在我的表中,我有一个“文本”列。 使用此 SQL: CREATE TEMPORARY TABLE produit2 ENGINE=MEMORY SELECT
谁能给我解释一下 df2 = df1 df2 = df1.copy() df3 = df1.copy(deep=False) 我已经尝试了所有选项并执行了以下操作: df1 = pd.DataFram
Hazelcast 是否具有类似于 Ehcache 的复制? http://www.ehcache.org/generated/2.9.0/pdf/Ehcache_Replication_Guide.
我有以下拓扑。一个 Ubuntu 16.04。运行我的全局 MySQL 服务器的 Amazon AWS 上的实例。我想将此服务器用作许多本地主服务器(Windows 机器 MySQL 服务器)的从服务
使用 SQLyog,我正在测试表中是否设置了正确的值。我尝试过 SELECT type_service FROM service WHERE email='test@gmail.com' 因此,只输出
有人可以提供一些关于如何配置 ElasticSearch 进行复制的说明。我在 Windows 中运行 ES,并且了解如果我在同一台服务器上多次运行 bat 文件,则会启动一个单独的 ES 实例,并且
一 点睛 ThreadGroup 复制线程的两个方法。 public int enumerate(Thread list[]) // 会将 ThreadGroup 中的 active 线程全部复制到
一 点睛 ThreadGroup 复制线程组的两个方法。 public int enumerate(ThreadGroup list[]) // 相对于 enumerate(list,true) pu
官方documentation Cassandra 说: Configure the keyspace and create the new datacenter: Use ALTER KEYSPAC
This question already has answers here: How to weight smoothing by arbitrary factor in ggplot2? (2个答
我们有一个表格来表明对各种俱乐部的兴趣。输出将数据记录在 Excel 电子表格中,其中列有他们的首选姓名、姓氏、电子邮件、代词,以及他们感兴趣的俱乐部的相应列中的“1”(下面的模型)。 我们希望为俱乐
This question already has answers here: Closed 8 years ago. Possible Duplicate: In vim, how do I get
如何复制形状及其所在的单元格?当我手动复制时,形状会跟随单元格,但是当我使用宏进行复制时,我会得到除形状之外的所有其他内容。 Cells(sourceRow, sourceColumn).Copy C
我是一名优秀的程序员,十分优秀!