创建自定义 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,因为它是容量,而不是大小,你的变量nsz,因为它是大小..(我明白你为什么感到困惑。 ..)

为了方便我自己,我将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。如果向量已满,则大小仅与容量相同,否则,它将始终小于容量。你明白了吗? 我经常从一种语言转换到另一种语言,所以如果没有解释器,我可能难以获得完美的语法,但我会编辑我的答案以包含一些你可能想要的代码使用。 问题似乎在于您如何使用nszcap 边界线互换。你不需要 both ncap。 (如果您认为是,请尝试解释两者之间的区别) -Maxime Fanchot,您的帮助不只是帮助。谢谢你的时间。

以上是关于创建自定义 Vector 类错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用自定义图标创建 TabBarIOS 时出现不变违规错误

利用std::allocator实现自定义的vector类

模板typedef与std :: vector有自定义分配器

自定义异常

用类模板实现容器存储自定义数据类型(类似于STL里面的vector)

自定义向量不支持 unique_ptr