Problema con el Constructor (C++ Error C2512, no appropriate default constructor available)

Necesito que mi constructor inicie cada elemento de mi arreglo en 0.0, pero con mi código me dice que:

Error C2512 'Vendedor': no appropriate default constructor available". 

Anexo el código:

#pragma once 
#include <iostream> 
#include <iomanip>
using namespace std;
class Vendedor
{
 public: 
   Vendedor(float Ventas[12]);
   void asignaventas(float);
   void imprimeventas();
 private: 
   float Ventas[12];
   float VentasTotal; 
   float CalVtasTotal(float);  
   float Ventastotal =0; }

#include "Vendedor.h"
#include <iostream> 
using namespace std;

Vendedor::Vendedor(float Ventas[12]) {
    for (int i = 0; i < 12; i++) {
        this->Ventas[i] = 0.0f;
    }
}

void Vendedor::asignaventas(float Ventas) {
    float x = 0;
    cout << "Introdusca la cantidad de ventas realizadas en los 12 meses: "<<endl; 
    for (int i = 0; i < 12; i++) {
        cin >> x; 
        this->Ventas[i] = x;
    } 
} 

void Vendedor::imprimeventas() {
    cout << " Las ventas ascienden a: " << CalVtasTotal(Ventas[12]) << endl;;
}

float Vendedor::CalVtasTotal(float Ventas) {  
    float total = 0;
    for (int i = 0; i < 12; i++) { 
    total = total + this->Ventas[i];
    }  
    this->VentasTotal = total;
    return VentasTotal;
}

#include <iostream> 
#include "Vendedor.h"
using namespace std; 

int main(int argc, char *argv[]) {  
    Vendedor ob; //aquí marca el error
    ob.asignaventas(12); 
    ob.imprimeventas();
    return 0;
}
4
задан 21.03.2016, 12:22
2 ответа

Я занимаю много времени, не работая с C ++, но если я не ошибаюсь, проблема - какой он определяется и его зовут строитель: прямо сейчас Vendedor только у него есть строитель, который берет как параметр ввода array float с размером 12:

Vendedor::Vendedor(float Ventas[12])

Но когда он объявляет себе объект, он делается таким образом:

Vendedor ob;

Что то, что он пробует, состоит в том, чтобы называть строителя без параметров, который не определен в коде (поэтому он помечает ошибку в этой линии).

Состоял бы в том, чтобы определять решение новый строитель (может быть больше одного), у которого не было бы параметров и который использовал бы назначенный по умолчанию array внутри:

Vendedor::Vendedor()

Альтернативно, делать что-то как это: Vendedor ob = new Vendedor(arr);, определив arr как array float размера 12.

1
ответ дан 24.11.2019, 14:51
  • 1
    не используйте того, что ты предложил мне, но заставил меня догадываться, что он это забывал пары и # 225; метры, большое спасибо, уже я это решил. – Alejandro Alamina 21.02.2016, 06:54

Как уже ответил, что Альваро Монторо одну из проблем, которые у тебя есть, состоит в том, чтобы создать, строитель, который получает параметр, что избегает того, чтобы было возможно строить один Vendedor не облегчая параметра, это полностью верное, так что я сконцентрируюсь на том, чтобы отвечать твой вопрос, на котором "строитель наставляет каждый элемент моей договоренности в 0.0".

Как уже о нем упомянули, ты не должен создавать строитель, можешь инициализировать 0 все члены в месте создания, как уже ты делаешь с Ventas::VentasTotal:

class Vendedor
{
public: 
    // Sin constructor
    void asignaventas(float);
    void imprimeventas();
private: 
    float Ventas[12] = {}; // Inicializa a 0 los 12 elementos
    float VentasTotal = .0f; 
    float CalVtasTotal(float);
    float Ventastotal = .0f;
};

Ввиду того, что Ventas[12] это атташе может извлекать пользу из инициализации атташе, которая, как он может, поворачивает в облегченной ссылке:

Если число статей "стартапа" меньше, чем число членов или список инициализации полностью пустой, остальные члены inicializalizarán с Вашими назначенными по умолчанию "стартапами", если они были proveídos в определении класса, или в противоположном случае (с C ++ 14) из-за пустых списков, которые реализуют инициализацию - стоимость.

(Я изменил текст, так как машинный перевод был странным, выделенный в полужирном шрифте мой)

В случае float инициализация - стоимость реализует инициализацию в нуль:

  1. Для каждой переменной, названной с продолжительностью службы статического хранения или помещения субпроцессов, перед любой другой инициализацией.
  2. Как часть последовательности инициализации - стоимости типов, которые не были бы классами и для членов без строителя классов, инициализировавших стоимостью.
  3. Когда массив символов инициализируется буквальной цепью, которая слишком короткая, оставшаяся часть массива - нуль инициализирует.

(Я изменил текст, так как машинный перевод был странным, выделенный в полужирном шрифте мой)

С предложенными изменениями возможно использовать Vendedor следующего способа:

int main()
{
    Vendedor v; // v.Ventas inicializado a 0, igual que el resto de miembros
    v.imprimeventas(); // Todo debe ser 0
    return 0;
}

Смоги поверните, что мы не переместили параметры строителя, так как используется назначенный по умолчанию строитель (который не получает параметры), который сам составитель произвел из-за нас.

Как альтернативы в float Ventas[12] = {}; мы имеем:

float Ventas[12]{};
float Ventas[12] = { .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f };
float Ventas[12]{ .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f, .0f };

Получая все их тот же эффект помещения всей стоимости договоренности 0.

Ты можешь видеть здесь пример использования.

PD:

Если мы инициализируем стоимость float я предпочитаю использовать буквальные float; буквальный 0 он типа int, в то время как буквальный 0.0 он типа double.

2
ответ дан 24.11.2019, 14:51