Почему код в конструкторе не запускается при вызове из другого файла?

#c #class #constructor

#c #класс #конструктор

Вопрос:

main.cpp

 
#include <iostream>
    
#include "shreeman.h"
    
using namespace std;
    
int main(){
    
    Shreeman object;
}


 

шриман.ч

 #ifndef SHREEMAN_H
#define SHREEMAN_H
    
    
class Shreeman
{
    public:
        shreeman();
};
    
#endif // SHREEMAN_H

 

shreeman.cpp

 
#include <iostream>
#include "shreeman.h"

using namespace std;

Shreeman::shreeman()
{
    cout<<"Hello Hello"<<endl;

}
 

Почему этот код не выводит «Привет, привет»? Я создал объект в main.cpp файл, но в консоли ничего не печатается.

Комментарии:

1. Вы опубликовали shreeman.h дважды и не опубликовали shreeman.cpp .

2. shreeman не является конструктором для Shreeman .

3. Вы неправильно написали имя конструктора — оно имеет нижний регистр s вместо верхнего S (и я ожидаю, что ваш компилятор хотя бы выдал предупреждение)?

4. @Shreeman24 Как shreeman(); в вашем определении класса вообще компилируется?

5. @Shreeman24 У нас возникли проблемы с тем, чтобы помочь вам, потому что вы публикуете то, что, по вашему мнению, представляет собой код, а не то, что он есть на самом деле, и разница важна. Пожалуйста, создайте [минимальный воспроизводимый пример] (Как создать минимальный, воспроизводимый пример)

Ответ №1:

В Shreeman классе shreeman() (нижний регистр s ) не является допустимым конструктором, это просто метод-член. Он должен быть переименован в Shreeman() (верхний регистр S ), чтобы быть конструктором (компилятор должен был предупредить вас об этом). C чувствителен к регистру, и имя конструктора должно точно соответствовать имени класса, регистру и всем остальным.

main.cpp

 #include "shreeman.h"
    
int main()
{    
    Shreeman object;
}
 

shreeman.h

 #ifndef SHREEMAN_H
#define SHREEMAN_H
    
class Shreeman
{
    public:
        Shreeman();
};
    
#endif // SHREEMAN_H
 

shreeman.cpp

 #include <iostream>
#include "shreeman.h"

using namespace std;

Shreeman::Shreeman()
{
    cout << "Hello Hello" << endl;
}
 

Комментарии:

1. Он не должен компилироваться без возвращаемого типа tough, не так ли?

2. @Shreeman24 Значит, вы совершенно упустили возможность рассказать нам об ошибках компилятора??

3. @RemyLebeau Он имеет в виду в коде операции. Вы подразумевали, что shreeman(); это был член, который не был конструктором, но это означало бы, что для него требовался возвращаемый тип, которого у него не было.

4. @CaptainGiraffe Я ничего такого не говорил. Но если возвращаемый тип был опущен при объявлении метода, компиляция просто использовала бы его по умолчанию int и должна была выдать предупреждение

5. @CaptainGiraffe разрешающий режим gcc / несоответствующий режим VS позволил бы это