首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vscode编译时错误-链接错误?

Vscode编译时错误-链接错误?
EN

Stack Overflow用户
提问于 2021-10-06 14:26:38
回答 1查看 52关注 0票数 0

我在尝试编译我的项目时遇到了一个问题。它给了我未定义的错误。所有的在线研究都告诉我编译器没有正确地链接我的文件。下面是我的代码和与之相关的错误。

MovieMonsterClass.h

代码语言:javascript
运行
复制
#ifndef MonsterMainClass_h
#define MonsterMainClass_h

class MovieMonster
{
    protected:
    
    int Power = 0; // The level of power of the monster
    double Health = 0; // The number of health points 
    bool intellect = false; // Whether the monster is smart
    bool XtrSize = false; //Does the monster have superduper size?

    public:

    MovieMonster(int power = 0, double health = 0, bool intellect = false, bool xtrSize = false); // Constructor
    MovieMonster(); //Default Constructor
   
    ~MovieMonster(); // Destructor
    void setPower(int);// sets the power of the monster
    void setHealth(double);//sets the health of the monster
    void setXtrSize(bool); //sets whter the monster is Xtra in the size department
    void setIntellect(bool);//sets whter the monster is intelligent or a dummy!
    void print() const; // prints the monster values
};

#endif

MovieMonster.cpp

代码语言:javascript
运行
复制
#include <iostream> 
#include <iomanip>
#include "MonsterMainClass.h"
  
using namespace std;

int p = 0;
double h = 0;
bool xtr = false;
bool smrt = false;

MovieMonster(p, h, xtr, smrt);

void MovieMonster::setPower(int p) // sets the power of the monster
{
    Power = p;
}

void MovieMonster::setHealth(double h) // set health function
{
    Health = h;
}

void MovieMonster::setXtrSize(bool xtr) // sets the size of monster Large or Small
{
    XtrSize = xtr;
}

void MovieMonster::setIntellect(bool smrt) // sets whether the monster is a dummy or sophisticated
{
    intellect = smrt;
}

void MovieMonster::print() const // prints the monsters characteristics
{
    for (size_t i = 0; i < 25; i++)
    {
        cout << "*";
    }
    cout << "Monster Power: " << Power << endl;
    cout << "Health: " << Health << endl;
    cout << "Xtr Size: " << XtrSize << endl;
    cout << "Intellect: " << intellect << endl;
    for (size_t i = 0; i < 25; i++)
    {
        cout << "*";
    }  

}

MovieMonster::~MovieMonster() {}

CreateMonster.cpp

代码语言:javascript
运行
复制
#include <iostream> 
#include "MonsterMainClass.h"
  
using namespace std;

int main()
{
    MovieMonster Renee;

    Renee.setHealth(.50);
    Renee.setIntellect(true);
    Renee.setXtrSize(true);
    Renee.setPower(100);
    Renee.print();

    return 0;
}

我使用的是Windows机器和VS Code,如下所示:

代码语言:javascript
运行
复制
Version: 1.60.2 (user setup)
Commit: 7f6ab5485bbc008386c4386d08766667e155244e
Date: 2021-09-22T12:00:31.514Z
Electron: 13.1.8
Chrome: 91.0.4472.164
Node.js: 14.16.0
V8: 9.1.269.39-electron.0
OS: Windows_NT x64 10.0.19043

奇怪的是,当我尝试编译书中的示例时,我得到了相同的错误。任何指导都是非常感谢的!

更新的错误:

代码语言:javascript
运行
复制
PS C:\Users\cdieckert-la\.vscode\COSC1436\Prog 2 Code test\Movie Monster Class> g++ .\CreateMonsters.cpp
.\CreateMonsters.cpp: In function 'int main()':
.\CreateMonsters.cpp:13:18: error: call of overloaded 'MovieMonster()' is ambiguous
     MovieMonster Monster;
                  ^~~~~~~
In file included from .\CreateMonsters.cpp:3:
.\MonsterMainClass.h:20:5: note: candidate: 'MovieMonster::MovieMonster()'
     MovieMonster(); //Default Constructor
     ^~~~~~~~~~~~
.\MonsterMainClass.h:19:5: note: candidate: 'MovieMonster::MovieMonster(int, double, bool, bool)'
     MovieMonster(int power = 0, double health = 0, bool intellect = false, bool xtrSize = false); // Constructor
     ^~~~~~~~~~~~
EN

回答 1

Stack Overflow用户

发布于 2021-10-06 14:48:42

类定义(在MonsterMainClass_h中)说明MovieMonster类有一个接受4个参数的构造函数、一个不接受任何参数的构造函数和一个析构函数。在问题中发布的代码中,这些都没有定义。

main中的代码使用四参数构造函数和析构函数。错误消息指出,这两者都没有在任何地方定义。

因此,作为第一步,将这些定义添加到MovieMonster.cpp中。

而且,正如一条评论所指出的,不要调用Renee.~MovieMonster();。编译器将在main结束时执行此操作。这就是使用析构函数的意义所在:您不必担心如何处理资源,因为析构函数将被隐式调用。

还有,不要在CreateMonsters.cpp中使用#include "MovieMonster.cpp"。您有两个源文件,它们应该分开保存。您的项目应该命名这两个文件,以便它们可以单独编译和链接。

注意:由于四参数构造器的所有四个参数都有默认值,因此可以不带参数地调用它。默认构造函数也可以。编译器会抱怨不使用参数的代码(MovieMonster monster;),因为这两个构造函数都可以在那里使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69467607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档