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

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.h и не разместили shreeman.cpp.

François Andrieux 11.12.2020 19:34
shreeman не является конструктором для Shreeman.
molbdnilo 11.12.2020 19:35

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

UnholySheep 11.12.2020 19:35

Пожалуйста, опубликуйте реальный код. #include <iostream\> никогда не сработает.

molbdnilo 11.12.2020 19:35

Извините, я новичок в переполнении стека, теперь я правильно выразился.

Shreeman24 11.12.2020 19:38

@UnholySheep не выдает предупреждения, но когда я использовал заглавную букву S, это работает. Почему я не могу использовать строчную букву s?

Shreeman24 11.12.2020 19:40

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

πάντα ῥεῖ 11.12.2020 19:40

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

Mooing Duck 11.12.2020 19:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В классе Shreemanshreeman() (строчная 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;
}

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

Captain Giraffe 11.12.2020 19:40

@ Shreeman24 Shreeman24 Итак, вы совсем забыли рассказать нам об ошибках компилятора ??

πάντα ῥεῖ 11.12.2020 19:42

@CaptainGiraffe Я использую Codeblocks, и он нормально компилируется.

Shreeman24 11.12.2020 19:42

@CaptainGiraffe Какой тип возврата? У конструктора нет возвращаемого типа. И main() (и только main()) с возвращаемым типом int имеет специальное правило, которое позволяет опускать оператор return.

Remy Lebeau 11.12.2020 19:42

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

Mooing Duck 11.12.2020 19:43

@πάνταῥεῖ Мой компилятор ничего не вернул, когда я использовал s меньшего размера. Поэтому код внутри конструктора не выводился.

Shreeman24 11.12.2020 19:43

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

Remy Lebeau 11.12.2020 19:43

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

Swift - Friday Pie 11.12.2020 19:45

@MooingDuck Итак, если бы я использовал shreeman () вместо Shreeman (), тогда мне нужно было бы сказать, например, int shreeman (), а затем что-то вернуть, верно?

Shreeman24 11.12.2020 19:47

@RemyLebeau «Но если бы возвращаемый тип был опущен в объявлении метода, компиляция просто по умолчанию использовала бы значение int и должна была выдать предупреждение». Хммм, странно, ошибки даже без -Wall -pedantic здесь: coliru.stacked-crooked.com/a /9a63f3ee7d6de44b

πάντα ῥεῖ 11.12.2020 19:50

@RemyLebeau Я использую компилятор GNU GCC. Когда я собрал и запустил свой код, компилятор не показал никаких ошибок. Только когда я изменил s на заглавную S, было выведено «Hello Hello».

Shreeman24 11.12.2020 19:52

@Shreeman24 CodeBlocks использует MinGW GCC в качестве набора инструментов, верно? Какая у вас сейчас версия GCC?

πάντα ῥεῖ 11.12.2020 19:53

Я действительно новичок в С++, поэтому мне нужно время, чтобы понять классы :)

Shreeman24 11.12.2020 19:53

@ Shreeman24 Shreeman24 Однако это не повод игнорировать предупреждения или сообщения об ошибках.

πάντα ῥεῖ 11.12.2020 19:54

@ πάνταῥεῖ В моем компиляторе не было сообщения об ошибке, и исходный код работал нормально. Он ничего не выводил, пока я не перешел на заглавную S

Shreeman24 11.12.2020 19:56

@ Shreeman24 Shreeman24 Можете ли вы скопировать код из моей ссылки выше в новый проект на вашем компьютере, скомпилировать его и показать нам результат, пожалуйста? (Лучше сделать это как еще одно доказательство в вашем вопросе)

πάντα ῥεῖ 11.12.2020 19:57

@ Shreeman24 Shreeman24 «В моем компиляторе не было сообщения об ошибке» - по крайней мере, должно было быть предупреждение. Если нет, то я сомневаюсь в вашем компиляторе. «исходный код работал нормально» — этого не было бы в стандартном C++ (demo), поэтому код должен использовать расширение компилятора, специфичное для поставщика. "Ничего не выводилось, пока я не поменял на заглавную S" - правильно, потому что shreeman() - это просто метод, который вы не вызываете, например: Shreeman object; object.shreeman();. Shreeman() — это конструктор, который вызывается автоматически.

Remy Lebeau 11.12.2020 20:00

@πάνταῥεῖ Вывод "Hello from GCC 8.1.0 !

Shreeman24 11.12.2020 20:03

@ Shreeman24 Shreeman24 Ну, это довольно старая версия GCC. Рекомендую обновиться до последней стабильной версии. Я предполагаю, что ваша версия все еще упакована с CodeBlocks, который, кажется, печально известен тем, что плохо поддерживается. У вас должен быть установщик MinGW, который упрощает загрузку и установку последних пакетов GCC. Также есть другие (лучшие) бесплатные IDE, которые вы можете использовать, но каждая из них имеет свои недостатки и требует хотя бы некоторых базовых знаний для правильной настройки.

πάντα ῥεῖ 11.12.2020 20:06

Последняя версия 6.3.0 или что-то в этом роде.

Shreeman24 12.12.2020 05:35

Другие вопросы по теме