我正在尝试编译我创建的这个程序,但我一直收到编译器错误,我不明白如何修复它们。
我创建了一个名为MyClass的类;它有私人会员和公共会员。
私人会员:
公众成员(成员职能):
构造函数:两个输入参数(int和string类型)和 使用参数初始化num和description。
GetNum:无参数,返回num成员变量的值。
我想要做的就是我的代码。
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
class MyClass
{
private:
int num = 0;
std::string description = 0;
public:
MyClass();
MyClass(int n1, std::string const& n) : num(n1), description(n){}
int GetNum();
int SetNum(int* Pointer);
string GetDesc();
char SetDesc(char* Pointer2);
int Square();
double SquareRoot();
int Factorial();
bool IsNegative();
};
MyClass::MyClass(){
//nothing
}
int GetNum()
{
int num;
return num;
}
void SetNum(int* Pointer)
{
int num;
*Pointer = num;
}
string GetDesc()
{
string description;
return description;
}
void SetDesc(string* Pointer2)
{
string description;
*Pointer2 = description;
}
int Square()
{
int num;
return(num * num);
}
int SquareRoot()
{
int num;
if (num > 0)
{
return sqrt(num);
}
else
{
return 0;
}
}
int Factorial()
{
int num;
if (num > 0 )
{
for (int a = 1; a<=num; a++)
{
num = num * a;
return num;
}
}
else
return 0;
}
bool IsNegative()
{
int num;
if (num < 0)
{
return true;
}
if (num >= 0)
{
return false;
}
else
{
return 0;
}
}
bool IsNegative()
{
int num;
if (num < 0)
{
return true;
}
if (num >= 0)
{
return false;
}
else
{
return 0;
}
void Display(MyClass b)
{
cout << b.GetNum() << endl;
cout << b.GetDesc() << endl;
cout << b.Square() << endl;
cout << b.SquareRoot() << endl;
cout << b.Factorial() << endl;
cout << b.IsNegative() << endl;
}
int main ()
{
bool flag = false;
char str1[100], str2[100];
cin >> str1 >> str2;
for (int i=0; i < strlen(str1); i++)
{
if (i==0 && str1[i] == '-')
continue;
if (!isdigit(str1[i]))
{
flag = true;
break;
}
}
if (!flag)
{
MyClass b(atoi(str1),str2);
Display(b);
}
else
{
MyClass b;
Display(b);
}
return 0;
}
新编译器错误是:
这是错误:警告:控制到达非void函数的结尾
}
^
/tmp/ccIwu0FB.o:在函数Display(MyClass)':
myclass.cc:(.text+0x1be): undefined reference to
MyClass :: GetNum()&#39;
myclass.cc :(。text + 0xx1f0):对MyClass::GetDesc()'
myclass.cc:(.text+0x22c): undefined reference to
MyClass :: Square()&#39;的未定义引用
myclass.cc:(.text+0x257):对MyClass::SquareRoot()'
myclass.cc:(.text+0x282): undefined reference to
MyClass :: Factorial()&#39;的未定义引用
myclass.cc :(。text + 0x2ad):对MyClass :: IsNegative()&#39;的未定义引用
collect2:错误:ld返回1退出状态
答案 0 :(得分:0)
strlen()
返回的值类型为size_t
,未签名。您的编译器设置为抱怨涉及有符号和无符号值的比较,因此您需要修复一些内容,以便您有两个有符号值或两个无符号值。
在上下文中,最简单/最好的解决方法是更改:
for (int i=0; i < strlen(str1); i++)
成:
for (size_t i = 0, len = strlen(str1); i < len; i++)
这解决了类型转换问题,也避免了在循环条件中评估strlen()
(当你在循环条件中有strlen()
时,它会将线性算法转换为二次算法)。
你有构造函数:
MyClass(std::string const& n, int num) : description(n){}
您尝试调用:
MyClass b(atoi(str1),str2);
这有int
和string
个参数。由于构造函数忽略num
参数,因此不清楚最好做什么。
也许:
MyClass(std::string const& n) : description(n){}
然后
MyClass b(str1);
或:
MyClass b(str2);
(两者在语法上都是有效的 - 如果没有更多的研究,如果有的话,对于你的程序在语义上是正确的,那么它是远非清晰的。)
或者,给定非默认构造函数的描述,您需要:
MyClass(std::string const& n1, int n2) : num(n2), description(n1) {}
并且呼叫应该是:
MyClass b(str1, atoi(str2));
或者也许:
MyClass b(str2, atoi(str1));
或可能是以下之一:
MyClass b(str2, atoi(str2));
MyClass b(str1, atoi(str1));