编译用户定义的类

时间:2016-05-02 05:32:05

标签: c++ string class pointers compiler-errors

我正在尝试编译我创建的这个程序,但我一直收到编译器错误,我不明白如何修复它们。

我创建了一个名为MyClass的类;它有私人会员和公共会员。

私人会员:

  • int类型的变量名为num。
  • 另一个名为description的字符串变量。

公众成员(成员职能):

  1. 默认构造函数:我使用空字符串将num和description初始化为0(零)。
  2. 构造函数:两个输入参数(int和string类型)和                 使用参数初始化num和description。

  3. GetNum:无参数,返回num成员变量的值。

  4. SetNum:类型为int的1个参数;                 设置num成员变量的值等于                 参数的值。
  5. GetDesc:没有参数;返回描述的值                 成员变量。
  6. SetDesc:string类型的1个参数;                设置description成员变量的值等于                 参数的值。
  7. 方形:无参数;               返回num成员变量的平方。
  8. SquareRoot:无参数;  如果是num> 0,返回(仅整数部分)的正方形               num成员变量的根;否则返回0。
  9. 因子:没有参数;               如果是num> 0,返回num成员的阶乘               变量;否则返回1.
  10. IsNegative:没有参数;               如果num成员变量是<返回true(布尔值) 0;               如果num成员变量是> = 0,则返回false(布尔值)。
  11. 我想要做的就是我的代码。

    #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退出状态

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);

这有intstring个参数。由于构造函数忽略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));