创建自定义 Vector 类错误
Posted
技术标签:
【中文标题】创建自定义 Vector 类错误【英文标题】:Creating a custom Vector class errors 【发布时间】:2017-07-25 01:12:53 【问题描述】:所以我正在尝试创建一个功能类似于矢量的自定义类。它应该有一个默认构造函数,它创建一个容量为 2 的空向量、一个容量为n
的参数化构造函数、一个析构函数、一个返回向量大小的函数、向量的容量、一个删除数据并将向量重置为容量 2 的函数,push_back
函数将 n
放在向量的末尾,以及返回存储在 n
的值的函数。我已经写出了大部分代码,但是每当我尝试使用 .capacity()
函数来显示“向量”的容量时,都会收到 driver.cpp 文件的错误。错误是
函数调用中的参数太少'和
Vector::capacity
:函数 不接受 0 个参数
每次我尝试在 driver.cpp 中使用capacity()
。请帮忙
//Vectors.h
#include "stdafx.h"
#include "driver.h"
#include "targetver.h"
#include <iomanip>
#include <array>
#include <stdio.h>
#include <tchar.h>
#include <string>
using namespace std;
class Vector
double* arr; // pointer to the first element of this myvec
int cap; // number of elements arr can hold (i.e. size of underlying array)
int n; // size of this myvec
int sz = 1;
// Increases the capacity of the underlying array to be sz. If sz
// is smaller than the current capacity then nothing is done.
// create an empty vector
void increase_capacity(int sz)
if (sz <= cap) return;
double* new_arr = new double[sz]; // allocate a new array
for (int i = 0; i < cap; ++i)
// copy old vector into new one
new_arr[i] = arr[i];
cap = sz; // set the new capacity
delete[] arr; // delete the old vector
arr = new_arr;
public:
Vector()
arr = new double[sz];
Vector(int n)
arr = new double[n];
int size() const
return n;
void push_back(double x)
if (n >= cap) increase_capacity(2 * cap);
arr[n] = x;
++n;
double capacity(int i, double val)
if (i < 0 || i >= n) cout << ("range error");
arr[i] = val;
return val;
double at(int n) const
if (n < 0 || n >= n) cout << ("range error");
return arr[n];
void clear()
delete[] arr;
Vector();
~Vector()
// destructor
delete[] arr;
;
//driver.cpp
const int TEST_VALUE1 = 21;
const int TEST_VALUE2 = 31;
const int TEST_VALUE3 = 41;
const int MAX = 12;
int main( )
// Create a default vector
Vector sam;
// push some data into sam
cout << "\nPushing three values into sam";
sam.push_back(TEST_VALUE1);
sam.push_back(TEST_VALUE2);
sam.push_back(TEST_VALUE3);
cout << "\nThe values in sam are: ";
// test for out of bounds condition here
// and test exception
for (int i = 0; i < sam.size( ) + 1; i++)
try
cout << sam.at(i) << " ";
catch(int badIndex)
cout << "\nOut of bounds at index " << badIndex << endl;
cout << "\n--------------\n";
// clear sam and display its size and capacity
sam.clear( );
cout << "\nsam has been cleared.";
cout << "\nSam's size is now " << sam.size( );
cout << "\nSam's capacity is now " << sam.capacity() << endl;
cout << "---------------\n";
// Push 12 values into the vector - it should grow
cout << "\nPush 12 values into sam.";
for (int i = 0; i < MAX; i++)
sam.push_back(i);
cout << "\nSam's size is now " << sam.size( );
cout << "\nSam's capcacity is now " << sam.capacity( ) << endl;
cout << "---------------\n";
cout << "\nTest to see if contents are correct...";
// display the values in the vector
for (int i = 0; i < sam.size( ); i++)
cout << sam.at(i) << " ";
cout << "\n--------------\n";
cout << "\n\nTest Complete...";
cout << endl;
system("PAUSE");
return 0;
以下是我的课程的相关要求:
创建空向量的默认构造函数。它的大小为零,容量为二。请记住,大小是指当前存储在向量中的元素数量。 创建容量为 n 的向量的参数化构造函数。它的大小最初为零。 返回向量大小的函数 size()。大小定义为已存储在向量中的整数值的数量。大小将随着整数值的添加而改变。 返回向量容量的函数 capacity( )。容量定义为可以存储在向量中的整数值的数量。容量随着向量的增长而变化。
【问题讨论】:
您可以编辑您的问题。没有理由在评论中添加更多信息 - 只需将其放在您的问题中即可。 你的capacity
函数接受一个 int 和一个 double double capacity(int i, double val)
,但你调用它时不带参数......就像你的错误消息所说的那样。
离题:我希望一个称为容量的方法返回容量,而不是元素的值。这很奇怪。它确实违反了最小意外法则。沿着这条路走下去就是黑暗面。
如果你不明白capacity
的定义应该是什么样子,你不可能写完这个类的其余部分。
这是您的代码cs.sfu.ca/CourseCentral/125/tjd/vector_example.html 的一个可能来源您或其他人已努力使其适应您的课程要求,但由于某些莫名其妙的原因将set
重命名为capacity
。发生这种情况的唯一方法是完全不了解这两个函数应该做什么。
【参考方案1】:
您定义的capacity
方法接受两个参数,就像您创建它的方式一样。它可能不应该,因为当您尝试使用它时,它应该完全依赖于对象并且只返回您想要的值。您可以选择提供参数:Vector::capacity(i, var)
,或者更改您的定义以接受 0 个参数。
根据我对 C++ 中实际 Vector
类方法 capacity()
的了解,您不应该接受任何参数。但是,根据我对您对capacity
的定义的了解,您正在修改一个组件,您确实需要同时提供一个浮点数和一个整数,而您在编写@ 时并没有这样做987654326@.
您的代码的第一部分看起来很奇怪(前面的 public:
),因为它不是构造函数,但您似乎正在初始化一个向量。此外,你的变量sz
应该重命名为cap
,因为它是容量,而不是大小,你的变量n
到sz
,因为它是大小..(我明白你为什么感到困惑。 ..)
为了方便我自己,我将double*
更改为double
。随意改回来。我还将sz
写成size
,因为两个字母看起来更漂亮。
class Vector
// initialise array myvec in constructors.
int cap; // number of elements arr can hold (i.e. size of underlying array)
int size; // size of this myvec (same as n)
此时,在构造函数之外“创建一个空向量”是没有用的。因此,我将这里的位移到了两个构造函数中。
public:
Vector()
double[2] arr; //creates an array of size two, that is empty.
cap = 2;
size = 0;
Vector(int n)
double[n] arr; //creates an array of size n, also empty.
cap = n;
size = 0;
int size() const
return size;
void push_back(double x)
if (size >= cap) increase_capacity(2 * cap);
arr[size] = x;
++size;
double capacity()
return cap;
其余的功能似乎还可以。请注意,我可能没有正确进行内存管理,尤其是构造函数。如果我这样做了,我一定会弄错的。我希望你能弄清楚。
编辑:在查看了pushback
方法之后,我现在明白了为什么你有increase_capacity
方法。这是与我的代码相关的编辑:
void increase_capacity(int new_cap)
//if (sz <= cap) return; THIS IS NOT NEEDED, since the function is only called when size > cap.
double[new_cap] arr; // allocate a new array - Note that once again I'm not using pointers, you may want to change this.
for (int i = 0; i < cap; ++i)
// copy old vector into new one
new_arr[i] = arr[i];
cap = new_cap; // set the new capacity
delete[] arr; // delete the old vector
arr = new_arr;
【讨论】:
此时我迷路了。我已经盯着这个东西看了好几个小时,我不知道哪条路是向上的。我已经尝试过了,代码将在 2 小时内到期。以下是代码的原始要求: 1. 创建一个空向量的默认构造函数。它的大小为零,容量为二。请记住,大小是指当前存储在向量中的元素数量。 2. 创建容量为 n 的向量的参数化构造函数。它的大小最初为零。 @jonthie 定义 4 和 5 是你必须注意的: Vector 的容量必须预先定义,它就像一个空槽来填充大小,但可能稍后。例如,默认构造函数的容量必须为 2,但大小为 0,因此arr
应该是大小为 2 的空数组。请注意,大小为 2 的数组不是大小为 2 的向量。 @ 987654342@ 将返回arr.length()
,因此在这种情况下,2。如果向量已满,则大小仅与容量相同,否则,它将始终小于容量。你明白了吗?
我经常从一种语言转换到另一种语言,所以如果没有解释器,我可能难以获得完美的语法,但我会编辑我的答案以包含一些你可能想要的代码使用。
问题似乎在于您如何使用n
、sz
和cap
边界线互换。你不需要 both n
和 cap
。 (如果您认为是,请尝试解释两者之间的区别)
-Maxime Fanchot,您的帮助不只是帮助。谢谢你的时间。以上是关于创建自定义 Vector 类错误的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用自定义图标创建 TabBarIOS 时出现不变违规错误
模板typedef与std :: vector有自定义分配器