#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 позволил бы это