【问题标题】:3 Unresolved external symbols (beginner C++)3 未解析的外部符号(初级 C++)
【发布时间】:2018-03-30 23:22:20
【问题描述】:

本周我的计算机科学入门课程刚刚介绍了函数,在检查了“未解析的外部符号”的主要线程之后,我认为它要么是

a) 你声明了函数,但从未在 main 之后调用它们

b) 您缺少正确的库

我只是不确定它是哪一个或如何正确地去做。另外,我认为我的逻辑在 calcSideC 块中略有缺陷,尽管我不确定

#include <iostream>
#include <cmath>

using namespace std;

float getSide();
float calcSideC(float sideA, float sideB, float total);
void displaySideC(float sideC);

int main()
{
    {
        float sideA = 0.0;
        float sideB = 0.0;
        float total = sideA + sideB;
        float sideC = sqrt(total);
        sideA = getSide();
        sideB = getSide();
        sideC = calcSideC(sideA, sideB, total);
        displaySideC(sideC);

        return 0;
    }

    float getSide();
    {
        float sideA;
        cout << "Enter two sides of a right triangle.\n\n" << "Side A: \n" << "Please enter the dimension:  ";

        cin >> sideA;

        return sideA;
    }
    float getSide();
    {
        float sideB;
        cout << "\n\n" << "Side B: \n" << "Please enter the dimension:  ";
        cin >> sideB;

        return sideB;
    }
    float calcSideC(float sideA, float sideB, float total);
    {
        float sideA;
        float sideB;
        float total;
        float sideC;
        pow(sideA, 2);
        pow(sideB, 2);
        float sqrt(total);
        return sideC;
    }
    void displaySideC(float sideC);
    {
        float sideC;
        cout << "The dimension of Side C is:  " << sideC;
    }
    system("pause");
    return 0;
}

【问题讨论】:

  • 你从来没有定义你的函数,比如getSide和其他。因此链接器错误。

标签: c++ unresolved-external


【解决方案1】:

您不能在其他函数中定义函数(并不是说您做的正确,因为您有额外的 ; 导致代码的行为与您的预期不同)。

您需要将函数定义移出main()

现在,在修复了该语法错误后,您的代码中仍然存在不少逻辑错误,包括:

  • 声明与函数参数同名的函数局部变量

  • 忽略std::pow()std::sqrt()的返回值

  • sideAsideB 被用户赋值之前计算total

尝试类似的方法:

#include <iostream>
#include <cmath>

using namespace std;

float getSideA()
{
    float sideA;
    cout << "\n\n" << "Side A: \n" << "Please enter the dimension:  ";    
    cin >> sideA;
    return sideA;
}

float getSideB()
{
    float sideB;
    cout << "\n\n" << "Side B: \n" << "Please enter the dimension:  ";
    cin >> sideB;
    return sideB;
}

float calcSideC(float sideA, float sideB)
{
    return sqrt(pow(sideA, 2) + pow(sideB, 2));
}

void displaySideC(float sideC)
{
    cout << "The dimension of Side C is:  " << sideC;
}

int main()
{
    cout << "Enter two sides of a right triangle.";
    float sideA = getSideA();
    float sideB = getSideB();

    float sideC = calcSideC(sideA, sideB);
    displaySideC(sideC);

    system("pause");
    return 0;
}

或者,如果你想前向声明函数:

#include <iostream>
#include <cmath>

using namespace std;

float getSideA();
float getSideB();
float calcSideC(float sideA, float sideB);
void displaySideC(float sideC);

int main()
{
    cout << "Enter two sides of a right triangle.";
    float sideA = getSideA();
    float sideB = getSideB();

    float sideC = calcSideC(sideA, sideB);
    displaySideC(sideC);

    system("pause");
    return 0;
}

float getSideA()
{
    float sideA;
    cout << "\n\n" << "Side A: \n" << "Please enter the dimension:  ";    
    cin >> sideA;
    return sideA;
}

float getSideB()
{
    float sideB;
    cout << "\n\n" << "Side B: \n" << "Please enter the dimension:  ";
    cin >> sideB;
    return sideB;
}

float calcSideC(float sideA, float sideB)
{
    return sqrt(pow(sideA, 2) + pow(sideB, 2));
}

void displaySideC(float sideC)
{
    cout << "The dimension of Side C is:  " << sideC;
}

【讨论】:

  • 我对你们感激不尽!你们都是巨大的帮助,如果可以的话,我会支持你们,但我太新了。绝对将这些答案用作函数的学习工具。
【解决方案2】:

你在 main 中声明了你的函数!这是错误的。把它们移到外面。 接下来,函数在声明行上没有分号..

IE:void func(); {} 是错误的,因为它应该是void func() {},没有分号。

  • 你有一个函数getSide()TWICE..
  • 你在system("pause");之前从main返回
  • calcSideC 具有与参数相同的局部变量(重新声明错误)。
  • displaySideC 有与参数相同的局部变量(重新声明错误)。
  • calcSideC 不使用sqrt(total); 的结果。
  • calcSizeC 实际上并没有使用勾股定理计算 sideC,因为你甚至没有使用 pow 结果..

正确的代码是:

#include <iostream>
#include <cmath>

using namespace std;

float getSideA();
float getSideB();
float calcSideC(float sideA, float sideB);
void displaySideC(float sideC);

int main()
{
    float sideA = 0.0;
    float sideB = 0.0;
    float sideC = 0.0;

    sideA = getSideA();
    sideB = getSideB();
    sideC = calcSideC(sideA, sideB);
    displaySideC(sideC);

    system("pause");
    return 0;
}


float getSideA()
{
    float sideA;
    cout << "Enter two sides of a right triangle.\n\n" << "Side A: \n" << "Please enter the dimension:  ";

    cin >> sideA;

    return sideA;
}

float getSideB()
{
    float sideB;
    cout << "\n\n" << "Side B: \n" << "Please enter the dimension:  ";
    cin >> sideB;

    return sideB;
}

float calcSideC(float sideA, float sideB)
{
    float total = pow(sideA, 2);
    total = total + pow(sideB, 2);
    return sqrt(total);
}

void displaySideC(float sideC)
{
    cout << "The dimension of Side C is:  " << sideC;
}

【讨论】:

  • 没有必要用零初始化sideAsideBsideC,因为它们之后会立即被覆盖
  • @RemyLebeau;你是 100% 正确的,但我不想改变 OP 的代码风格。就像 main 之前的函数声明等等。另一个是total = total + blah.. 我不确定他们是否知道+= 等等。所以出于这个原因,我试图保持他们的代码完全相同,但我猜只是修复错误和编译。就个人而言,我也会摆脱using namespace std,因为它困扰着我.. :(
猜你喜欢
  • 2013-02-28
  • 2012-11-19
  • 1970-01-01
  • 2012-12-17
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多