Не получается создать объект класса конструктором по умолчанию

У меня есть код. В коде есть класс Machine. Суть в том, что я должен первый объект создавать конструктором с параметрами, а второй - конструктором по умолчанию. С первым, вроде, проблем нет, а вот со вторым - куча. При попытке компиляции возникает 4 критические ошибки. Не понимаю, что нет так...

Строки, на которые ругается компилятор:

fin << M2.name << "" << M2.kol << " " << M2.kolH;
M2.SHOW();

Ошибки:

Ошибка  4   error C2228: выражение слева от ".name" должно представлять класс, структуру или объединение    
Ошибка  5   error C2228: выражение слева от ".kol" должно представлять класс, структуру или объединение 
Ошибка  6   error C2228: выражение слева от ".kolH" должно представлять класс, структуру или объединение    
Ошибка  7   error C2228: выражение слева от ".SHOW" должно представлять класс, структуру или объединение    

Код:

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

class Machine {
public:
    char name[50]; // название станка
    float kol; // количество отработанных часов
    float kolH; // количество изготовленных деталей за час

    void TEST(void);
    void INIT(void);
    void SHOW(void);

    Machine();
    Machine(const char *na, float ko, float koH);
    Machine(const Machine & obj);
    ~Machine();
};

Machine::Machine() {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Этот обьект был создан в конструкторе по умолчанию.\n";
    strcpy(name, "");
    kol = 0;
    kolH = 0;
}

Machine::Machine(const char *na, float ko, float koH) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Этот обьект был создан в конструкторе с параметрами.\n";
    strcpy(name, na); 
    kol = ko;
    kolH = koH;
}

Machine::Machine(const Machine & obj) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Этот обьект был создан в конструкторе копирования.\n";
    strcpy(name, obj.name);
    kol = obj.kol;
    kolH = obj.kolH;
}

Machine::~Machine() {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Удаление объекта деструктором.\n";
}

void Machine::SHOW(void) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Информация о станке:\n";
    cout << "\nНазвание станка > " << name;
    cout << "\nКоличество отработанных часов > " << kol;
    cout << "\nКоличество изготовленных деталей за час > " << kolH;
}

void Machine::INIT(void) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Введите данные о станке:\n";
    cout << "\nНазвание > "; cin >> name;
    cout << "\nКоличество отработанных часов > "; cin >> kol;
    cout << "\nКоличество изготовленных деталей за час > "; cin >> kolH;
}

int main() {
    setlocale(0, "");

    Machine M1("Станок большой", 32, 64.5); 
    M1.SHOW();
    Machine M2();

    ofstream fout;
    fout.open("1.txt");
    fout << M1.name << "" << M1.kol << " " << M1.kolH;
    fout.close();

    ifstream fin;
    fin.open("1.txt");
    fin << M2.name << "" << M2.kol << " " << M2.kolH;
    fin.close();

    cout << "\nИнформация про станок 2:\n";
    M2.SHOW();

    fin.open("1.txt");
    fin.seekg(0);
    cout << "\nПотоковый вывод содержания 1.txt\n";
    char ch;
    while(fin.get(ch))
        cout << ch;
    cout << "\nВывод закончен\n";
    fin.close();

    return 0;
}

Ответы (1 шт):

Автор решения: Harry
Machine M2();

это объявление функции M2, не принимающей параметров и возвращающей объект Machine. Пишите

Machine M2;

или

Machine M2{};

И еще - ну кто же выводит во входной поток?..

ifstream fin;
fin.open("1.txt");
fin << M2.name << "" << M2.kol << " " << M2.kolH;

Или ofstream, или >>...

→ Ссылка