如何将常量传递给我的动态数组类添加方法

How to pass a constant to my DynamicArray class add method

本文关键字:数组 动态 添加 方法 我的 常量      更新时间:2023-10-16

My DynamicArray 几乎是一个 ArrayList。我想允许用户拥有一个连续的内存块,其中元素一个接一个,如果需要,还有额外的空间。我遇到的唯一问题是存储整数/浮点数/布尔值等......我决定将我的_array做成T**,以便我可以存储它们。

但是,我在将常量传递给我的 DynamicArray 的 add 方法时遇到了一些麻烦。在传递值之前,我需要将值存储在变量中,否则会出现此错误:

    g++ main.cpp -Wall -Werror -std=c++0x
    main.cpp: In function ‘int main()’:
main.cpp:14:21: error: no matching function for call to ‘triforce::DynamicArray<std::basic_string<char> >::add(const char [5])’
main.cpp:14:21: note: candidates are:
DynamicArray.h:150:10: note: bool triforce::DynamicArray<T>::add(T&) [with T = std::basic_string<char>]
DynamicArray.h:150:10: note:   no known conversion for argument 1 from ‘const char [5]’ to ‘std::basic_string<char>&’
DynamicArray.h:176:10: note: void triforce::DynamicArray<T>::add(uint, T&) [with T = std::basic_string<char>, uint = unsigned int]
DynamicArray.h:176:10: note:   candidate expects 2 arguments, 1 provided

我的 DynamicArray 有一个名为 _array 的 T** 变量。

/**
144      * @brief Adds an element to the end of the array. The array will double in size,
145      * if needed.
146      * @param element The element to be added to the array.
147      * @returns Returns if the element was added successfully.
148      */
149     template<class T>
150     bool DynamicArray<T>::add(T& element)
151     {
152         if(_array == NULL)
153         {
154             errorMsg("Cannot add to null array");
155             return false;
156         }
157 
158         if(_size == _capacity)
159         {
160             increaseCapacity(_capacity * 2);
161         }
162 
163         _array[_size] = &element;
164         _size++;
165 
166         return true;
167     }

这有效:

13     string val1 = "val1";
 14     array.add(val1);

这行不通

13     string val1 = "val1";
 14     array.add("val1");

我如何使这个函数可以接受常量,例如只传递 1 或字符串"hello",而无需先将其放入变量中?我尝试在参数中放入 const,但这似乎也不起作用。

在下面的示例中:

#include <type_traits>
template <class T>
void foo( T& arg )
{
  static_assert( std::is_same<T&, const char(&)[6]>::value, "Must be same" );
}
int main()
{
  foo( "Hallo world" );
  return 0;
}

该类型被推导为常量字符[6]。 然后成为对数组的引用,因此具有类型:

常量字符 (&数组)[6]

数组的名称(没有运算符 [] 限定)衰减为类型 char*,或者在本例中为 const char*:

_array[_size] = &element;

因此,取其地址,上面 RHS 的类型变为 const char*,并且不可能将 const char* 类型的变量分配给 char& 类型的变量(由 _array[size] 返回)。

您可以按如下方式解决此问题:

template<class T>
void DynamicArray<T>::add( const T& element )
{
  if(_size == _capacity)
  {
    increaseCapacity(_capacity * 2);
  }
  _array[_size] = element;
  _size++;
}
//------ Added code --------
template<class T>
  template <int N> 
void DynamicArray<T>::add( const T (&array) [N] )
{
  for( std::size_t i = 0; i < N; ++i )
  {
    //Calls your add per element...
    add( array[i] );
  }
}

请注意,您将无法在上面的代码中使用 std::string。为此,需要另一个过载。另请注意,我的函数没有返回类型(就像你的一样)。返回类型在您的代码中没有任何用途,因为任何错误(例如动态分配的结果)都会引发。

最后,正如其他地方提到的,上面的代码只是为了理解概念而编写的。实际上,人们会使用 std::vector,它当然已经是一个动态数组。

第三个注释行说明了问题:

DynamicArray.h:150:10: note: no known conversion for argument 1 from ‘const char [5]’ to ‘std::basic_string<char>&’

因此,您的DynamicArray<string>正在尝试将字符串文字转换为std::string &,并且没有办法做到这一点。

您可以按照尝试的方式执行,事先创建string,也可以修改add()方法以不引用。

 template<class T>
 bool DynamicArray<T>::add(T element)
 {
     //...

这样,就可以在堆栈上为您创建一个副本,由将传递给其构造函数的字符串文本初始化。