Конструктор и функции, не работающие в C++

Я сделал test.cpp и test.h с помощью конструктора и функции с помощью cout, а затем вызвал их из main.cpp, чтобы напечатать некоторый текст. При запуске main.exe текст не появляется.

Либо я упускаю что-то фундаментальное, либо, может быть, что-то не так с настройками моего компилятора.

Я пробовал с VS Code и Visual Studio 2022, и происходит то же самое.

test.cpp

#include <iostream>
#include <string>

class Test
{
public:
    Test() { std::cout << "cout from constructor"; }
    void print()
    {
        std::cout << "cout from print funcion";
    }
};

тест.ч

#pragma once

class Test
{
public:
    Test() {}
    void print()
    {
    }
};

main.cpp

#include <iostream>
#include <string>
#include "test.h"

int main()
{
    std::cout << "cout from main.cpp";

    Test t; //this is not calling constructor
    t.print(); //this is not calling print()

    return 0;
}

ВЫХОД: cout из main.cpp

У вас есть два определения класса Test, одно в заголовке и одно в файле cpp. Я предполагаю, что вы вообще не компилируете и не связываете файл cpp, потому что если бы вы это делали, у вас было бы несколько ошибок определения, поэтому пустые функции из заголовка - это все, что существует. Добавьте свои журналы к ним, и вы увидите это.

Retired Ninja 01.04.2023 00:58

Добавьте #include "test.h" в test.cpp и скомпилируйте test.cpp с main.cpp.

273K 01.04.2023 01:00

Либо я упускаю что-то фундаментальное, либо, может быть, что-то не так с настройками моего компилятора. Боюсь, упустил что-то фундаментальное. Я рекомендую перечитать раздел вашего текста, посвященный определению и реализации классов.

user4581301 01.04.2023 01:13
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как отмечено в комментариях, убедитесь, что вы определяете конструктор по умолчанию и функцию print только один раз. В настоящее время вы определяете как в заголовке, так и в файле реализации. Версии в заголовочном файле ничего не печатают.

Я бы также посоветовал вам завершать отладочные отпечатки с новой строкой, чтобы избежать проблем с буферизацией вывода.

Если вы устраните эти проблемы, результат будет таким, как ожидалось.

% cat test.h
#pragma once

class Test {
public:
    Test();
    void print();
};

% cat test.cpp
#include <iostream>
#include "test.h"

Test::Test() { 
    std::cout << "cout from constructor" << std::endl; 
}
    
void Test::print() {
    std::cout << "cout from print funcion" << std::endl;
}

% cat main.cpp
#include <iostream>
#include "test.h"

int main() {
    std::cout << "cout from main.cpp" << std::endl;

    Test t; 
    t.print(); 

    return 0;
}

% g++ -std=c++17 test.cpp main.cpp
% ./a.out
cout from main.cpp
cout from constructor
cout from print funcion
%

Спасибо. Все говорили о пустом конструкторе и функции, но большой проблемой было то, как я пытался это запустить. Я использовал «Запустить задачу сборки > g++.exe». а затем .\main.exe. Это работало при использовании % g++ -std=c++17 test.cpp main.cpp % ./a.out

coldfusion 01.04.2023 01:40

Когда у вас есть несколько файлов реализации, вам нужно скомпилировать и скомпоновать их все для создания исполняемого файла. Поскольку ваш заголовок содержал реализацию, исключение этапа компиляции и компоновки test.cpp «сработало», но результаты оказались не такими, как ожидалось.

Chris 01.04.2023 01:42

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