ошибка C2512: нет подходящего конструктора по умолчанию (не классов)

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

Вот оба полных сообщения об ошибках:

C2512: «Запись»: нет подходящего конструктора по умолчанию

IntelliSense: для класса «Запись» не существует конструктора по умолчанию.

#include <iostream>
#include <string>
using namespace std;

const int NG = 4; // number of scores

struct Record
{
    string name;  // student name
    int scores[NG];
    double average;

    // Calculate the average
    // when the scores are known
    Record(int s[], double a)
    {
        double sum = 0;

        for(int count = 0; count != NG; count++)
        {
            scores[count] = s[count];
            sum += scores[count];
        }

        average = a;
        average = sum / NG;
    }
};

int main()
{
    // Names of the class
    string names[] = {"Amy Adams", "Bob Barr", "Carla Carr",
                      "Dan Dobbs", "Elena Evans"};

    // exam scores according to each student
    int exams[][NG]= {  {98, 87, 93, 88},
                        {78, 86, 82, 91},
                        {66, 71, 85, 94},
                        {72, 63, 77, 69},
                        {91, 83, 76, 60}};

    Record *room = new Record[5];


    return 0;
}

person SoloMael    schedule 08.11.2013    source источник
comment
Если вы думаете, что это не пытается вызвать конструктор по умолчанию для класса Record, вы ошибаетесь: Record *room = new Record[5];   -  person WhozCraig    schedule 08.11.2013


Ответы (1)


Ошибка вполне ясна. К тому времени, когда вы пытаетесь выделить массив:

Record *room = new Record[5];

конструктор по умолчанию, то есть Record::Record(), должен быть реализован так, чтобы можно было создать 5 экземпляров Record:

struct Record
{
    ...
    Record() : average(0.0) { }
    Record(int s[], double a) { ... }
};

Также обратите внимание, что динамического распределения — это то, чего вы хотите избежать в C++ (за исключением ситуаций, когда у вас есть на это действительно веские причины). В этом случае было бы разумнее использовать вместо него std::vector:

std::vector<Record> records(5);
person LihO    schedule 08.11.2013
comment
Спасибо! Я бы проголосовал за это, но у меня недостаточно репутации. - person SoloMael; 08.11.2013
comment
@SoloMael: Хех. Ничего страшного. Я рад, что помог :) - person LihO; 08.11.2013