Custom Array Class: Constructor for Initialization of List

Corcovado

I'm working on a custom array class in C++ (as a self-led exercise), and I'm not sure how to create a constructor that allows me to do something along the lines of:

#include "array.h"
#include <iostream>
int main()
{
    array<int> test = {1, 2, 3, 4};
    std::cout << test(1) << std::endl;
    return 0;
}

The error that the compiler (VS Express 2013) gives me is "no instance of constructor array::array [with T = int]" matches the argument list. argument types are (int, int, int, int)."

I'm not sure what the constructor that takes the enumeration of a set of elements is called. I know I've properly overloaded operator()(const int&). I also know that this (for a reason that's not clear to me) works:

#include "array.h"
#include <iostream>
int main()
{
    array<char> test = "abcd";
    std::cout << test(1) << std:: endl; // prints 'a', as expected. 
    std::cout << test(4) << std::endl; // prints 'd', as expected.
    return 0;
}

This is achieved with a array(const T[]) constructor: will the solution for the array<int> test = {1, 2, 3, ..., n} case be similar?

Thanks in advance for any guidance.

EDIT: Including the code below, in case it's helpful.

template<typename T>
class array
{
public:
    typedef T* iterator;
    typedef const T* const_iterator;
private:
    iterator head;
    unsigned long elems;
public:
    array()
        : head(nullptr)
        , elems(0) {}
    array(const unsigned long &size)
        : head(size > 0 ? new T[size] : nullptr)
        , elems(size) {}
    array(const T[]);
    array(const array&);
    ~array() { delete[] head; }

    iterator begin() const { return head; }
    iterator end() const { return head != nullptr ? &head[elems] : nullptr; }
    unsigned long size() const { return elems; }

    array& operator=(const array&);
    T& operator()(const unsigned long&);
};

template<typename T>
array<T>::array(const T rhs[])
{
    unsigned long size = sizeof(rhs) / sizeof(T);
    head = new T[size];
    iterator pointer = begin();
    for (const_iterator i = &rhs[0]; i != &rhs[0] + size; i++)
        *pointer++ = *i;
}

template<typename T>
array<T>::array(const array<T> &rhs)
{
    head = new T[rhs.size()];
    iterator pointer = begin();
    for (const_iterator i = rhs.begin(); i != rhs.end(); i++)
        *pointer++ = *i;
}

template<typename T>
array<T>& array<T>::operator=(const array<T> &rhs)
{
    if (this != &rhs)
    {
        delete[] head;
        head = new T[rhs.size()];
        iterator pointer = begin();
        for (const_iterator i = rhs.begin(); i != rhs.end(); i++)
            *pointer++ = *i;
    }
    return *this;
}

template<typename T>
T& array<T>::operator()(const unsigned long &index)
{
    if (index < 1 || index > size())
    {
        // Add some error-handling here.
    }
    return head[index - 1];
}
Piotr Skotnicki
#include <initializer_list>

// ...

template <typename T>
class array
{   
    // ... 
    array(std::initializer_list<T> il);    

// ...    
template <typename T>
array<T>::array(std::initializer_list<T> il)
{
    unsigned long size = il.size();
    head = new T[size];
    iterator pointer = begin();
    for (const T& i : il)
        *pointer++ = i;
}

// ...
array<int> test = {1, 2, 3, 4};

DEMO


Suggested improvements:

  1. array(const T rhs[]); is an equivalent of array(const T* rhs);, that is, a pointer, which means that sizeof(rhs) / sizeof(T) expression will not give you the number of items. If you want a special constructor for const char*, then consider either an entire array<char> specialization or at least disabling this constructor from the overload resolution if T is not char

  2. head = new T[size]; default-initializes all elements (calls default constructor for each instance of type T). Then you call an assignment operation: *pointer++ = *i;. This can be improved by utilizing a placement-new, like ::new ((void*)ptr) T(*i); where ptr is a pointer to a raw, uninitialized memory buffer, like new char[sizeof(T)*size] or returned from get_temporary_buffer.


And if you are wondering why the following works array<char> test = { "abcd" }; with your current implementation then here is an explanation:

  1. array<T> class has a constructor taking const T[], which for T=char is instantiated as array<char>::array(const char*).

  2. List-initialization can be used to call object's constructor.

  3. Your const T[] constructor is not explicit, which means that you can use copy-initialization syntax like below:

    array<char> test = { "test" };
    
  4. The expression sizeof(rhs) / sizeof(T), although not valid as explained above, for T=char evaluates to sizeof(char*) / sizeof(char), which is (most-probably) 4 / 1 = 4.

  5. Your "test" used for initialization has exactly 4 letters, your luck.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Custom Array Class: Constructor for Initialization of List

From Dev

Abstract class constructor initialization

From Dev

initialize class array in initialization list c++

From Dev

C++ Get class member address in constructor initialization list

From Dev

ADL in constructor initialization list

From Dev

Initialization of class variables in constructor in java

From Dev

Anonymous initialization of class with protected constructor

From Dev

Initialization of class variables in constructor in java

From Dev

Delphi class constructor for object initialization

From Dev

No matching constructor for initialization of constructor of templated class

From Dev

Circular dependency in constructor initialization list

From Dev

C++ initialization list in constructor

From Dev

List evaluation order in constructor initialization

From Dev

Setting values in nested class fields using parent class constructor initialization list

From Dev

Initializing a member of type array in a superclass, using the initialization list of a derived class

From Dev

In class initialization and initializer list

From Dev

Initialization list in singleton class

From Dev

Initialization of class array

From Dev

pointer to class objects initialization with class constructor?

From Dev

Convert a list of a custom class to an object array

From Dev

VB.NET Custom class list of array

From Dev

Why unconstructed object can be passed to base class constructor in derived initialization list

From Dev

Class member array of objects without default constructor and deleted copy constructors initialization

From Dev

Array of Object - std::array - Constructor Initialization Problems

From Dev

How do I access an array list inside of a class constructor in java?

From Java

base class initialization error, no matching constructor

From Dev

Braces (without constructor) initialization of a derived class

From Dev

does POD class object initialization require constructor?

From Dev

final vairable initialization relative to super class constructor

Related Related

  1. 1

    Custom Array Class: Constructor for Initialization of List

  2. 2

    Abstract class constructor initialization

  3. 3

    initialize class array in initialization list c++

  4. 4

    C++ Get class member address in constructor initialization list

  5. 5

    ADL in constructor initialization list

  6. 6

    Initialization of class variables in constructor in java

  7. 7

    Anonymous initialization of class with protected constructor

  8. 8

    Initialization of class variables in constructor in java

  9. 9

    Delphi class constructor for object initialization

  10. 10

    No matching constructor for initialization of constructor of templated class

  11. 11

    Circular dependency in constructor initialization list

  12. 12

    C++ initialization list in constructor

  13. 13

    List evaluation order in constructor initialization

  14. 14

    Setting values in nested class fields using parent class constructor initialization list

  15. 15

    Initializing a member of type array in a superclass, using the initialization list of a derived class

  16. 16

    In class initialization and initializer list

  17. 17

    Initialization list in singleton class

  18. 18

    Initialization of class array

  19. 19

    pointer to class objects initialization with class constructor?

  20. 20

    Convert a list of a custom class to an object array

  21. 21

    VB.NET Custom class list of array

  22. 22

    Why unconstructed object can be passed to base class constructor in derived initialization list

  23. 23

    Class member array of objects without default constructor and deleted copy constructors initialization

  24. 24

    Array of Object - std::array - Constructor Initialization Problems

  25. 25

    How do I access an array list inside of a class constructor in java?

  26. 26

    base class initialization error, no matching constructor

  27. 27

    Braces (without constructor) initialization of a derived class

  28. 28

    does POD class object initialization require constructor?

  29. 29

    final vairable initialization relative to super class constructor

HotTag

Archive