Как мне создать массив этой структуры в C ++ 11?

0

Я новичок в c++, и я хочу создать и создать массив из ниже структуры. Любая помощь пожалуйста! благодаря

struct contact{
    string name;
    string address;
    string phone;
    string email;
    contact(string n, string a, string p, string e);
    };
Теги:
arrays
struct
c++11

3 ответа

3

Проблема заключается в том, что вы пытаетесь создать экземпляр массива contact объектов, но этот класс не имеет конструктора по умолчанию, потому что вы добавили конструктор, не имеющий значения по умолчанию. Это удаляет созданный компилятором конструктор по умолчанию. Чтобы вернуть его, вы можете использовать default:

struct contact{
  string name;
  string address;
  string phone;
  string email;
  contact() = default; // HERE
  contact(string n, string a, string p, string e);
};

Это позволяет вам делать такие вещи:

contact contactsA[42];
std::array<contacts, 42> contactsB;

Изменить: альтернативное решение, учитывая простоту вашего типа, заключается в удалении определенных пользователем конструкторов. Это сделает тип агрегированным, что позволит вам использовать агрегатную инициализацию, и вам не нужно предпринимать никаких специальных действий для включения построения по умолчанию:

struct contact
{
  string name;
  string address;
  string phone;
  string email;
};

Теперь вы можете использовать агрегатную инициализацию:

contact c{"John", "Doe", "0123-456-78-90", "[email protected]"};

и создавать экземпляры массивов по-прежнему:

contact contactsA[42];
std::array<contacts, 42> contactsB;
  • 0
    Или просто не указывать оба ctors и полагаться на агрегатную инициализацию?
  • 0
    @ Хорошая мысль, я не заметил взаимно-однозначного соответствия между параметрами конструктора и членами данных. Я редактирую свой ответ соответственно.
Показать ещё 1 комментарий
1

В C++, если вы создаете класс без каких-либо конструкторов, компилятор создаст для вас тривиальный конструктор по умолчанию - то есть конструктор, который не принимает аргументов. Поскольку вы создали конструктор не по умолчанию, компилятор не будет генерировать конструктор по умолчанию для вас. Обычно вы создаете массив типа "контакт" со следующим:

contact my_array[10];

Это вызовет конструктор по умолчанию для каждого члена. Поскольку конструктор по умолчанию отсутствует, вы, скорее всего, увидите, что это невозможно скомпилировать.

Я бы рекомендовал добавить конструктор по умолчанию. Ваша новая структура может выглядеть примерно так:

struct contact{
  string name;
  string address;
  string phone;
  string email;
  contact();  // This is your default constructor
  contact(string n, string a, string p, string e);
};

После этого вы должны теперь создать массив со следующим:

contact my_array[10];
  • 0
    Это было очень полезно! спасибо :) Есть ли способ для меня, чтобы создать массив с переменной? Например, я хочу создать массив размером с количество строк в файле. Поэтому я получаю количество строк в файле, а затем сохраняю его в переменной.
  • 0
    Спасибо, не забудьте высказать свое мнение и принять, если он ответил на ваш вопрос. Также не забудьте взглянуть на ответ @juanchopanza; это дает еще больше информации. Чтобы создать массив переменной длины, я бы порекомендовал учебник, такой как этот
0
#include <vector>
#include <array>
#include <string>

using std::string;

struct contact{
  string name;
  string address;
  string phone;
  string email;
  contact(string n, string a, string p, string e);
};

std::vector<contact> contacts1;      // for an array without a size known at compile time.
std::array<contact, 1> contacts2 = { // for an array with a known and static size.
  contact{ "Bob Smith", "42 Emesgate Lane, Silverdale, Carnforth, Lancashire LA5 0RF, UK", "01254 453873", "[email protected]"}
};
  • 1
    версия std::array , вероятно, будет barf, потому что у contact нет конструктора по умолчанию.
  • 0
    да, вы правы, массив std :: не работает, я попытался найти, как создать конструктор по умолчанию и не повезло
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню