Я сделал 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
Добавьте #include "test.h"
в test.cpp и скомпилируйте test.cpp с main.cpp.
Либо я упускаю что-то фундаментальное, либо, может быть, что-то не так с настройками моего компилятора. Боюсь, упустил что-то фундаментальное. Я рекомендую перечитать раздел вашего текста, посвященный определению и реализации классов.
Как отмечено в комментариях, убедитесь, что вы определяете конструктор по умолчанию и функцию 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
Когда у вас есть несколько файлов реализации, вам нужно скомпилировать и скомпоновать их все для создания исполняемого файла. Поскольку ваш заголовок содержал реализацию, исключение этапа компиляции и компоновки test.cpp «сработало», но результаты оказались не такими, как ожидалось.
У вас есть два определения класса
Test
, одно в заголовке и одно в файле cpp. Я предполагаю, что вы вообще не компилируете и не связываете файл cpp, потому что если бы вы это делали, у вас было бы несколько ошибок определения, поэтому пустые функции из заголовка - это все, что существует. Добавьте свои журналы к ним, и вы увидите это.