我正在学习C ++中的构造函数,但是MSVS编译器的行为很奇怪,我也不明白为什么。编译器的成功似乎取决于最近的编译尝试。我的期望是,如果我的代码成功编译一次,则它应该始终成功编译,并且如果给出错误,则应该始终给出错误。对于我的代码,情况并非如此。我在Windows 10的免费MSVS 2019 IDE中使用调试器。
我有3个文件构成了我的项目,并且将我称为A,B和C的项目有3个不同版本。
版本A 是下面前三个显示中显示的代码。我认为版本A应该可以按预期进行编译和运行。 版本A中的任何实际错误都可能是该问题的次要原因。代码应定义一个类,创建该类的实例(运行构造函数),调用该类的方法,最后调用程序终止时该对象的析构函数。
以下代码在Cat.h中。
#pragma once
#include <iostream>
class Cat {
private:
bool happy;
public:
Cat();
~Cat();
void meow();
};
以下是文件Cat.cpp中的内容。
#include <iostream>
#include "Cat.h"
Cat::Cat() {
std::cout << "Creating Cat" << std::endl;
happy = false;
};
Cat::~Cat() {
std::cout << "Deleting Cat..." << std::endl;
};
void Cat::meow() {
if (happy) {
std::cout << "Meow" << std::endl;
}
else
{
std::cout << "SSSSSsssss" << std::endl;
}
return;
};
以下是我的主文件。
#include "Cat.h"
int main() {
Cat cat;
cat.meow();
}
版本B 与版本A 相同,不同之处在于在Cat的构造函数中声明了happy的一个更改,从而使happy成为构造函数的局部变量。 / p>
Cat::Cat() {
std::cout << "Creating Cat" << std::endl;
bool happy = false;
}
版本C 与版本A 相同,除了明显的错误,即在Cat.h中的类声明之后删除了分号。
Cat();
~Cat();
void meow();
}
现在要怪异的行为。
如果我第一次尝试编译 A版,则会出现以下错误:
1>Debug\Cat.obj : warning LNK4042: object specified more than once; extras ignored
1>Source.obj : error LNK2019: unresolved external symbol "public: __thiscall Cat::Cat(void)" (??0Cat@@QAE@XZ) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "public: __thiscall Cat::~Cat(void)" (??1Cat@@QAE@XZ) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "public: void __thiscall Cat::meow(void)" (?meow@Cat@@QAEXXZ) referenced in function _main
如果我现在将版本A 更改为版本B 并进行编译,则不会出现任何错误,但是我不会在cat的构造函数中初始化happy。然后,如果我将版本B 更改回版本A ,则代码将按预期进行编译和运行。
现在,版本A 可以编译并运行,即使之前使用的代码与之前一样也出错。
如果现在我将版本A 更改为版本C 并进行编译,则会收到明显的错误:
1>Cat.cpp
error C2533: 'Cat::{ctor}': constructors not allowed a return type
1>Cat.h
fatal error C1004: unexpected end-of-file found
如果现在我将此版本C 更改为版本A 并进行编译,则会收到与最初编译版本A 相同的错误。恢复为 B版并返回即可解决该问题。