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
Шриман.cpp
#include <iostream>
#include "shreeman.h"
using namespace std;
Shreeman::shreeman()
{
cout<<"Hello Hello"<<endl;
}
Почему этот код не выводит «Привет, привет»? Я создал объект в файле main.cpp, но в консоли ничего не печатается.
shreeman
не является конструктором для Shreeman
.
Вы неправильно написали имя конструктора — оно имеет строчную s
вместо прописной S
(и я ожидаю, что ваш компилятор, по крайней мере, выдал предупреждение)?
Пожалуйста, опубликуйте реальный код. #include <iostream\>
никогда не сработает.
Извините, я новичок в переполнении стека, теперь я правильно выразился.
@UnholySheep не выдает предупреждения, но когда я использовал заглавную букву S, это работает. Почему я не могу использовать строчную букву s?
@ Shreeman24 Shreeman24 Как вообще компилируется shreeman();
в вашем определении класса?
@ Shreeman24 Shreeman24 У нас возникли проблемы с тем, чтобы помочь вам, потому что вы опубликовали то, что, по вашему мнению, представляет собой код, а не то, чем он является на самом деле, и разница важна. Пожалуйста, предоставьте [Минимальный воспроизводимый пример] (Как создать минимальный воспроизводимый пример)
В классе Shreeman
shreeman()
(строчная s
) не является допустимым конструктором, это просто метод-член. Его нужно переименовать в Shreeman()
(верхний регистр S
), чтобы он был конструктором (компилятор должен был предупредить вас об этом). C++ чувствителен к регистру, и имя конструктора должно точно совпадать с именем класса, регистром и всем остальным.
main.cpp
#include "shreeman.h"
int main()
{
Shreeman object;
}
шриман.ч
#ifndef SHREEMAN_H
#define SHREEMAN_H
class Shreeman
{
public:
Shreeman();
};
#endif // SHREEMAN_H
Шриман.cpp
#include <iostream>
#include "shreeman.h"
using namespace std;
Shreeman::Shreeman()
{
cout << "Hello Hello" << endl;
}
Он не должен компилироваться без типа возвращаемого значения, не так ли?
@ Shreeman24 Shreeman24 Итак, вы совсем забыли рассказать нам об ошибках компилятора ??
@CaptainGiraffe Я использую Codeblocks, и он нормально компилируется.
@CaptainGiraffe Какой тип возврата? У конструктора нет возвращаемого типа. И main()
(и только main()
) с возвращаемым типом int
имеет специальное правило, которое позволяет опускать оператор return
.
@RemyLebeau Он имеет в виду код ОП. Вы подразумевали, что shreeman();
был членом, который не был конструктором, но это означало бы, что ему требуется тип возвращаемого значения, которого у него не было.
@πάνταῥεῖ Мой компилятор ничего не вернул, когда я использовал s меньшего размера. Поэтому код внутри конструктора не выводился.
@CaptainGiraffe Я такого не говорил. Но если бы возвращаемый тип был опущен в объявлении метода, компиляция просто установила бы его по умолчанию на int
и должна была выдать предупреждение.
@CaptainGiraffe разрешающий режим gcc/несовместимый режим VS позволит это
@MooingDuck Итак, если бы я использовал shreeman () вместо Shreeman (), тогда мне нужно было бы сказать, например, int shreeman (), а затем что-то вернуть, верно?
@RemyLebeau «Но если бы возвращаемый тип был опущен в объявлении метода, компиляция просто по умолчанию использовала бы значение int и должна была выдать предупреждение». Хммм, странно, ошибки даже без -Wall -pedantic
здесь: coliru.stacked-crooked.com/a /9a63f3ee7d6de44b
@RemyLebeau Я использую компилятор GNU GCC. Когда я собрал и запустил свой код, компилятор не показал никаких ошибок. Только когда я изменил s на заглавную S, было выведено «Hello Hello».
@Shreeman24 CodeBlocks использует MinGW GCC в качестве набора инструментов, верно? Какая у вас сейчас версия GCC?
Я действительно новичок в С++, поэтому мне нужно время, чтобы понять классы :)
@ Shreeman24 Shreeman24 Однако это не повод игнорировать предупреждения или сообщения об ошибках.
@ πάνταῥεῖ В моем компиляторе не было сообщения об ошибке, и исходный код работал нормально. Он ничего не выводил, пока я не перешел на заглавную S
@ Shreeman24 Shreeman24 Можете ли вы скопировать код из моей ссылки выше в новый проект на вашем компьютере, скомпилировать его и показать нам результат, пожалуйста? (Лучше сделать это как еще одно доказательство в вашем вопросе)
@ Shreeman24 Shreeman24 «В моем компиляторе не было сообщения об ошибке» - по крайней мере, должно было быть предупреждение. Если нет, то я сомневаюсь в вашем компиляторе. «исходный код работал нормально» — этого не было бы в стандартном C++ (demo), поэтому код должен использовать расширение компилятора, специфичное для поставщика. "Ничего не выводилось, пока я не поменял на заглавную S" - правильно, потому что shreeman()
- это просто метод, который вы не вызываете, например: Shreeman object; object.shreeman();
. Shreeman()
— это конструктор, который вызывается автоматически.
@πάνταῥεῖ Вывод "Hello from GCC 8.1.0 !
@ Shreeman24 Shreeman24 Ну, это довольно старая версия GCC. Рекомендую обновиться до последней стабильной версии. Я предполагаю, что ваша версия все еще упакована с CodeBlocks, который, кажется, печально известен тем, что плохо поддерживается. У вас должен быть установщик MinGW, который упрощает загрузку и установку последних пакетов GCC. Также есть другие (лучшие) бесплатные IDE, которые вы можете использовать, но каждая из них имеет свои недостатки и требует хотя бы некоторых базовых знаний для правильной настройки.
Последняя версия 6.3.0 или что-то в этом роде.
Вы дважды разместили
shreeman.h
и не разместилиshreeman.cpp
.