【问题标题】:Calling a Class member function in Global Scope using friend Gives 27 ERRORS使用朋友在全局范围内调用类成员函数会出现 27 个错误
【发布时间】:2016-07-05 18:34:40
【问题描述】:

//我的头文件

//Header File
#include<iostream>
using namespace std;

MyFloat rotate_right(MyFloat obj)
{

    /*All that this function is supposed to do, is to return a new object, that object will
    be having array elements in the order like     2.2   3.2   4.2   5.2  6.2   where the 
    original(object that is passed in parameter) object must be having array elements 
    in order like  3.2   4.2   5.2   6.2   2.2
    */
    MyFloat c;
    c.size = obj.size;
    c.arr = nullptr;
    c.arr = new float [obj.size];
    c.arr[0] = obj.arr[obj.size - 1];
    for(int i = 1,j=0; i < (obj.size - 1); i++,j++)
    {
        c.arr[j] = obj.arr[i];
    }
    return c;
}


class MyFloat
{
    public:
    MyFloat();//Default Constructor
    MyFloat(int data);//Parameterized Constructor
    MyFloat(MyFloat & const obj);//Copy Constructor
    void input();//Filling Array
    void PrintFloat();//For Displaying Array
    MyFloat& operator=(MyFloat & const obj);//Assignment Operator Overloading
    friend MyFloat rotate_right(MyFloat obj);/////////////This is the Function which is causing Problem/////////////
    ~MyFloat();//Destructor

    private:
    int size;//size of array
    float *arr;

};

///////////这是定义所有功能的Cpp文件

#include"My_Floats_Header.h"



MyFloat::MyFloat()
{
    cout << "Default Constructor Called!" << endl;
    size = 0;
    arr = nullptr;
}

MyFloat::MyFloat(int _size)
{
    cout << "Parametrized Constructor Called!" << endl;
    size = _size;
    arr = nullptr;
    arr = new float [_size];
}

void MyFloat :: input()
{
    for(int i = 0 ; i < size; i++)
    {
        cout << "Enter an Element = ";
        cin >> arr[i];
    }
}

MyFloat :: MyFloat(MyFloat & const obj)
{
    size = obj.size;
    arr = nullptr;
    arr = new float [size];
    for(int i = 0 ; i < obj.size; i++)
    {
        arr[i] = obj.arr[i];
    }
}

MyFloat &  MyFloat :: operator=(MyFloat & const obj)
{
    size = obj.size;
    arr = nullptr;
    arr = new float [size];
    for(int i = 0 ; i < obj.size; i++)
    {
        arr[i] = obj.arr[i];
    }
    return *this;
}

void MyFloat :: PrintFloat()
{
    for(int i = 0 ; i < size; i++)
    {
        cout << arr[i];
    }
    cout << endl;
}

MyFloat::~MyFloat()
{
    if(arr != nullptr)
    {
        delete [] arr;
    }
    size = 0;
}

////cpp文件有mian()

#include"My_Floats_Header.h"


int main()
{
    MyFloat *floatNumber = new MyFloat(5);//declaration
    floatNumber -> input();//taking input
    MyFloat newfloatNumber = *floatNumber;
    floatNumber = rotate_right(floatNumber);

    cout << "My Float without Rotation: ";
    newfloatNumber.PrintFloat();

    cout << "My Float after Rotation: ";
    floatNumber -> PrintFloat();
    system ("pause");
    return 0;
}

我遇到的错误:

错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int(在第 4 行)

错误 C2146 语法错误:缺少 ';'在标识符“rotate_right”之前(在第 4 行)

错误 C2143 语法错误:缺少 ';'在“{”之前(第 5 行)

错误 C2447 '{':缺少函数头(旧式正式列表?)(在第 5 行)

错误 C2143 语法错误:缺少 ';'在 '&' 之前(在第 40 行)

错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int(在第 40 行)

错误 C2086 'int MyFloat':重新定义(在第 40 行)

错误 C2761 'MyFloat &MyFloat::operator =(MyFloat &)': 不允许成员函数重新声明(在第 41 行)

错误 C2059 语法错误:'{'(在第 41 行)

错误 C2143 语法错误:缺少 ';'在“{”之前(第 41 行)

错误 C2447 '{':缺少函数头(旧式正式列表?)(在第 41 行)

错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int(在第 4 行)

错误 C2146 语法错误:缺少 ';'在标识符“rotate_right”之前(在第 4 行)

错误 C2143 语法错误:缺少 ';'在“{”之前(第 5 行)

错误 C2447 '{':缺少函数头(旧式正式列表?)(在第 5 行)

错误 C2065 'floatNumber':未声明的标识符(在第 6 行)

错误 C2061 语法错误:标识符“MyFloat”(在第 6 行)

错误 C2065 'floatNumber':未声明的标识符(在第 7 行中)

'->input' 左侧的错误 C2227 必须指向类/结构/联合/泛型类型(在第 7 行)

错误 C2146 语法错误:缺少 ';'在标识符“newfloatNumber”之前(在第 8 行)

错误 C2065 'newfloatNumber':未声明的标识符(在第 8 行)

错误 C2065 'floatNumber':未声明的标识符(在第 8 行中 )

错误 C2065 'floatNumber':未声明的标识符(在第 9 行中)

错误 C2065 'newfloatNumber':未声明的标识符(在第 12 行)

“.PrintFloat”左侧的错误 C2228 必须具有类/结构/联合(在第 12 行中)

错误 C2065 'floatNumber':未声明的标识符(第 15 行)

'->PrintFloat' 左侧的错误 C2227 必须指向类/结构/联合/通用类型(第 15 行)

【问题讨论】:

标签: visual-c++


【解决方案1】:

MyFloat rotate_right() 可能不应该在头文件中。如果你把它拿出来,你应该解决(大部分?全部?)你的错误。

我的建议是让它成为 MyFloat 的 static method

作为替代方案,您可以将 rotate_right() 保留为独立函数,并将 #include "MyFloat.h 简单地放在 .cpp 文件的顶部。

【讨论】:

    【解决方案2】:

    在头文件中,将类定义移到rotate_right()定义的上方。这将使您更接近工作代码。订单很重要。

    【讨论】:

    • 选项 1:将“rotate_right()”移到“class MyFloat”上方(如您建议的那样)。这将修复(至少一些)编译错误。选项 2:添加 forward declaration - 更好。选项 3) 将任何/所有独立功能移动到 SEPARATE .CPP 文件 - 最佳。独立函数通常 NOT 属于标题。尤其是没有header guard!
    猜你喜欢
    • 2016-05-29
    • 2011-05-20
    • 2021-08-16
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2013-09-02
    • 2019-02-17
    • 2011-06-22
    相关资源
    最近更新 更多