未在此范围内声明? 有一个可怕的夜晚,我对C++是新的,我不太明白我在做什么。我只问了一个问题,但我认为这会解决所有问题,任何朝着正确方向的努力都会非常感激,哪怕只是一个暗示

未在此范围内声明? 有一个可怕的夜晚,我对C++是新的,我不太明白我在做什么。我只问了一个问题,但我认为这会解决所有问题,任何朝着正确方向的努力都会非常感激,哪怕只是一个暗示,c++,class,scope,C++,Class,Scope,我想我应该在main.cpp中重新声明它们,但这会清除值。。。正确的? [错误位于代码注释的数字运算部分“//数字运算部分”下的for循环中] 在这里之前,我几乎解决了这个问题,不幸的是,我不得不发布这个问题的全部代码 我将从我得到的错误开始--> 这是main.cpp #include "complex.h" #include "complex-functions.cpp" main(int argc, char *argv[]) { int here; int a

我想我应该在main.cpp中重新声明它们,但这会清除值。。。正确的? [错误位于代码注释的数字运算部分“//数字运算部分”下的for循环中]

在这里之前,我几乎解决了这个问题,不幸的是,我不得不发布这个问题的全部代码 我将从我得到的错误开始-->

这是main.cpp

#include "complex.h"
#include "complex-functions.cpp"    

main(int argc, char *argv[]) 
{
    int here;
    int amountComplex, mRoot, nPower, form, i, j;
    double tempRealorMag, tempImagorPhase, userInput1, userInput2;
    COMPLEX::complex secondnumber, atemp, stemp, mtemp, dtemp, ptemp, rtemp, ctemp;

    FILE *inputf; //Pointer to the input filepath
    FILE *outputf; //Pointer to the output filepath

    switch (argc)
    {
        case 2:
            fprintf( stderr,"Error: Please also provide an output filename\n");
            return(1);
        case 3:
            break; // have input file and output file; all is OK
        default:
            fprintf( stderr,"Error: Please provide input and output filenames respectively as command line arguments\n");
            return(1);
    }

    if((inputf=fopen(argv[1],"r"))==NULL)
    {
        fprintf(stderr,"Error opening input file file. Check permissions.\n");
        return(1);
    }

    if((outputf=fopen(argv[2],"w"))==NULL)
    {
        fprintf(stderr,"Error opening output file. Check permissions.\n");
        return(1);
    }

// read the first four numbers from the text file

    fscanf(inputf, "%d",  &amountComplex);
    fscanf(inputf, "%d",  &form);
    fscanf(inputf, "%d",  &nPower);
    fscanf(inputf, "%d",  &mRoot);

    if (form != 1, 0) 
    {
        cout <<"Number must be in Cartesian or Polar format  ONLY\n";
        return(1);
    }

    if (amountComplex <= 0)
    {
        cout <<"Number of complex computations must be above zero.\n";
        return (1);
    }

   COMPLEX:: complex myCarray[amountComplex];

// reads the numbers and puts them into an array; closes inputfile

    for (i = 0; i < amountComplex; i++)
    {
        fscanf(inputf, "%lf",  &tempRealorMag);
        fscanf(inputf, "%lf",  &tempImagorPhase);
        myCarray[i].real = tempRealorMag;
        myCarray[i].imaginary = tempImagorPhase;
    }
    fclose(inputf);


// enters the second the number to be added, can be in
// cartesian (0) or polar (1) formats 

// cartesian format
    if (form == 0)
    {
        cout << "\nEnter real part of your number: ";
        cin >>   userInput1;
        cout << "\nEnter imaginary part of your number" ;
        cin >>   userInput2;
        secondnumber.real = userInput1;
        secondnumber.imaginary = userInput2;
    }

// polar format
    if (form == 1)
    {
        cout <<"\nEnter Magnitude of your number: ";
        cin >>  userInput1;
        cout <<"\nEnter Phase of your number: ";
        cin >>  userInput2;
        secondnumber.real = userInput1; 
        secondnumber.imaginary = userInput2;
    }    

// writes results    
// cartesian format
    if(form == 0)
    {
        fprintf(outputf, "This will be in Cartesian format, the order of results are:\n"
            "Real part\nImaginary part\nMagnitude\nPhase\nPower\nRoot\nConjugate\n"
            "Addition\n"Subtraction\nMultiplication\nDivision\n\n");
    }
// polar format
    if(form == 1)
    {
        fprintf(outputf, "This will be in Polar format, the order of results are:\n"
            "Real part\nImaginary part\nMagnitude\nPhase\nPower\nRoot\nConjugate\n"
            "Addition\nSubtraction\nMultiplication\nDivision\n\n");
    }

// number crunching part of code    
    for(j = 0; j < amountComplex; j++)
    {
// Real part, Imaginary part, Magnitude, Phase, Power, Root, 
// and Conjugate of complex number input array
        fprintf(outputf, "%lf\n", getReal(myCarray[j], form));
        fprintf(outputf, "%lf\n", getImaginary(myCarray[j], form));
        fprintf(outputf, "%lf\n", getMagnitude(myCarray[j], form));
        fprintf(outputf, "%lf\n", getPhase(myCarray[j], form));

        ptemp = getPower(nPower, myCarray[j], form);
        rtemp = getRoot(mRoot, myCarray[j], form);
        ctemp = getConjugate(myCarray[j]);

        fprintf(outputf, "%lf %lf \n", ptemp.real, ptemp.imaginary);
        fprintf(outputf, "%lf %lf \n", rtemp.real, rtemp.imaginary);
        fprintf(outputf, "%lf %lf \n", ctemp.real, ctemp.imaginary);

// Addition, Subtraction, Multiplication, Division with Second Number entered by user
        atemp = add(myCarray[j], secondnumber, form);
        stemp = subtract(myCarray[j], secondnumber, form);
        mtemp = multiply(myCarray[j], secondnumber, form);
        dtemp = divide(myCarray[j], secondnumber, form);

        fprintf(outputf, "%lf %lf \n", atemp.real, atemp.imaginary);
        fprintf(outputf, "%lf %lf \n", stemp.real, stemp.imaginary);
        fprintf(outputf, "%lf %lf \n", mtemp.real, mtemp.imaginary);
        fprintf(outputf, "%lf %lf \n", dtemp.real, dtemp.imaginary);

        fprintf(outputf, "\n\tNext Complex Number");
    }
    fclose(outputf);

} //end of main function

您正在调用的函数是类函数,位于
类复合体中。您需要通过该类的实例调用它们,或者(如果它们是
静态
函数)通过限定名称空间来调用它们:
COMPLEX::getReal


如果要使用
COMPLEX::getReal
调用它们,则需要将它们声明为
静态
——此时它们将无法访问成员数据。

调用的函数是类函数,位于
类COMPLEX
中。您需要通过该类的实例调用它们,或者(如果它们是
静态
函数)通过限定名称空间来调用它们:
COMPLEX::getReal


如果要使用
COMPLEX::getReal
调用它们,则需要将它们声明为
static
——此时它们将无法访问成员数据。

您的类定义是多余的:COMPLEX不应该是类,而应该是命名空间。如果以这种方式更改complex.h,代码将编译(带有一些警告…)


您的类定义是多余的:COMPLEX不应该是一个类,而应该是一个名称空间。如果以这种方式更改complex.h,代码将编译(带有一些警告…)



您不必发布整个代码-一个简单的示例会更有帮助。在第157行的
getReal
之前添加
COMPLEX::
怎么样?然后,您可能必须在定义
getReal
的地方添加
static
关键字。您肯定是对的,但我不知道我是否把事情搞砸了,我想我对这件事感到厌倦和沮丧xD抱歉@Kyss Tao当我这样做时,我会得到这样的错误:
不能在没有对象的情况下调用成员函数'COMPLEX::COMPLEX::add(COMPLEX::COMPLEX,COMPLEX::COMPLEX,int)
类的用途是什么?它仅仅是为了聚合函数而不存在它的实例吗?如果是这样的话,它的所有成员函数都应该是静态的。我以前从未上过课。我如何使它们静止?只需在类的每个成员之前添加
static
?您不必发布整个代码-一个最简单的示例会更有帮助。在第157行中添加
COMPLEX::
getReal
之前如何?然后,您可能必须在定义
getReal
的地方添加
static
关键字。您肯定是对的,但我不知道我是否把事情搞砸了,我想我对这件事感到厌倦和沮丧xD抱歉@Kyss Tao当我这样做时,我会得到这样的错误:
不能在没有对象的情况下调用成员函数'COMPLEX::COMPLEX::add(COMPLEX::COMPLEX,COMPLEX::COMPLEX,int)
类的用途是什么?它仅仅是为了聚合函数而不存在它的实例吗?如果是这样的话,它的所有成员函数都应该是静态的。我以前从未上过课。我如何使它们静止?在类的每个成员前面加上
static
?如果我明白你的意思,我可以在类中加上for循环,然后从主函数调用该类?只需添加单词
static
double getReal(复数n,int形式)变成
静态双getReal(复数n,int形式)定义也是一样(你用大括号的地方)嘿,我想我明白了:D谢谢你:DSo如果我明白你的意思,我可以把for循环放在类中,然后从主函数调用类?只需添加单词
static
double-getReal(复数n,int-form)变成
静态双getReal(复数n,int形式)定义也是一样(你用大括号的地方)嘿,我想我明白了:D非常感谢:D你完全正确。然而,有人告诉我,我必须使用类来实现这一点。尽管这是多余的,我必须这样做。然后你应该改变你的设计:一个类是要实现的,而不仅仅是声明一些你完全正确的东西。然而,有人告诉我,我必须使用类来实现这一点。尽管这是多余的,但我必须这样做。然后你应该改变你的设计:类是用来实现的,而不仅仅是声明一些东西
#include "complex.h"
#include "complex-functions.cpp"    

main(int argc, char *argv[]) 
{
    int here;
    int amountComplex, mRoot, nPower, form, i, j;
    double tempRealorMag, tempImagorPhase, userInput1, userInput2;
    COMPLEX::complex secondnumber, atemp, stemp, mtemp, dtemp, ptemp, rtemp, ctemp;

    FILE *inputf; //Pointer to the input filepath
    FILE *outputf; //Pointer to the output filepath

    switch (argc)
    {
        case 2:
            fprintf( stderr,"Error: Please also provide an output filename\n");
            return(1);
        case 3:
            break; // have input file and output file; all is OK
        default:
            fprintf( stderr,"Error: Please provide input and output filenames respectively as command line arguments\n");
            return(1);
    }

    if((inputf=fopen(argv[1],"r"))==NULL)
    {
        fprintf(stderr,"Error opening input file file. Check permissions.\n");
        return(1);
    }

    if((outputf=fopen(argv[2],"w"))==NULL)
    {
        fprintf(stderr,"Error opening output file. Check permissions.\n");
        return(1);
    }

// read the first four numbers from the text file

    fscanf(inputf, "%d",  &amountComplex);
    fscanf(inputf, "%d",  &form);
    fscanf(inputf, "%d",  &nPower);
    fscanf(inputf, "%d",  &mRoot);

    if (form != 1, 0) 
    {
        cout <<"Number must be in Cartesian or Polar format  ONLY\n";
        return(1);
    }

    if (amountComplex <= 0)
    {
        cout <<"Number of complex computations must be above zero.\n";
        return (1);
    }

   COMPLEX:: complex myCarray[amountComplex];

// reads the numbers and puts them into an array; closes inputfile

    for (i = 0; i < amountComplex; i++)
    {
        fscanf(inputf, "%lf",  &tempRealorMag);
        fscanf(inputf, "%lf",  &tempImagorPhase);
        myCarray[i].real = tempRealorMag;
        myCarray[i].imaginary = tempImagorPhase;
    }
    fclose(inputf);


// enters the second the number to be added, can be in
// cartesian (0) or polar (1) formats 

// cartesian format
    if (form == 0)
    {
        cout << "\nEnter real part of your number: ";
        cin >>   userInput1;
        cout << "\nEnter imaginary part of your number" ;
        cin >>   userInput2;
        secondnumber.real = userInput1;
        secondnumber.imaginary = userInput2;
    }

// polar format
    if (form == 1)
    {
        cout <<"\nEnter Magnitude of your number: ";
        cin >>  userInput1;
        cout <<"\nEnter Phase of your number: ";
        cin >>  userInput2;
        secondnumber.real = userInput1; 
        secondnumber.imaginary = userInput2;
    }    

// writes results    
// cartesian format
    if(form == 0)
    {
        fprintf(outputf, "This will be in Cartesian format, the order of results are:\n"
            "Real part\nImaginary part\nMagnitude\nPhase\nPower\nRoot\nConjugate\n"
            "Addition\n"Subtraction\nMultiplication\nDivision\n\n");
    }
// polar format
    if(form == 1)
    {
        fprintf(outputf, "This will be in Polar format, the order of results are:\n"
            "Real part\nImaginary part\nMagnitude\nPhase\nPower\nRoot\nConjugate\n"
            "Addition\nSubtraction\nMultiplication\nDivision\n\n");
    }

// number crunching part of code    
    for(j = 0; j < amountComplex; j++)
    {
// Real part, Imaginary part, Magnitude, Phase, Power, Root, 
// and Conjugate of complex number input array
        fprintf(outputf, "%lf\n", getReal(myCarray[j], form));
        fprintf(outputf, "%lf\n", getImaginary(myCarray[j], form));
        fprintf(outputf, "%lf\n", getMagnitude(myCarray[j], form));
        fprintf(outputf, "%lf\n", getPhase(myCarray[j], form));

        ptemp = getPower(nPower, myCarray[j], form);
        rtemp = getRoot(mRoot, myCarray[j], form);
        ctemp = getConjugate(myCarray[j]);

        fprintf(outputf, "%lf %lf \n", ptemp.real, ptemp.imaginary);
        fprintf(outputf, "%lf %lf \n", rtemp.real, rtemp.imaginary);
        fprintf(outputf, "%lf %lf \n", ctemp.real, ctemp.imaginary);

// Addition, Subtraction, Multiplication, Division with Second Number entered by user
        atemp = add(myCarray[j], secondnumber, form);
        stemp = subtract(myCarray[j], secondnumber, form);
        mtemp = multiply(myCarray[j], secondnumber, form);
        dtemp = divide(myCarray[j], secondnumber, form);

        fprintf(outputf, "%lf %lf \n", atemp.real, atemp.imaginary);
        fprintf(outputf, "%lf %lf \n", stemp.real, stemp.imaginary);
        fprintf(outputf, "%lf %lf \n", mtemp.real, mtemp.imaginary);
        fprintf(outputf, "%lf %lf \n", dtemp.real, dtemp.imaginary);

        fprintf(outputf, "\n\tNext Complex Number");
    }
    fclose(outputf);

} //end of main function
    #ifndef COMPLEX_H
    #define COMPLEX_H
    #include<iostream>
    #include<fstream>
    #include<string>
    #include<vector>
    #include<iomanip>
    #include<cmath>

    using namespace std;

    class COMPLEX
    {
    public:
        typedef struct{
            double real;
            double imaginary;       
                }complex;

            double getReal(complex n, int form );
            double getImaginary(complex n, int form);
            double getMagnitude(complex n, int form);
            double getPhase(complex n, int form);
            complex add(complex n, complex m, int form);
            complex subtract(complex n, complex m, int form);
            complex multiply(complex n, complex m, int form);
            complex divide(complex n, complex m, int form);
            complex getConjugate(complex n);
            complex getPower(int npower, complex n, int form);
            complex getRoot(int mroot, complex n, int form);
            complex changeToCart(complex n);
            complex changeToPolar(complex n);
    };
    #endif`

FUNCTION FILE-->
`
    #include "complex.h"
    //returns the real part of the complex number
    double COMPLEX :: getReal(complex n, int form)
    {
     if(form == 0)
        return(n.real);
     if(form == 1)
     {
        complex temp = changeToCart(n);
        return(temp.real);
     }
    }

    //returns the imaginary part of the complex number
    double COMPLEX ::  getImaginary(complex n, int form)
    {
     if(form == 0)
        return(n.imaginary);
     if(form == 1) 
        return((n.real * sin(n.imaginary)));

    }

    //returns the magnitude of the complex number
    double COMPLEX ::  getMagnitude(complex n, int form)
    {
     if(form == 0)
     {
        float x = n.real;
        float y = n.imaginary;
        return(sqrt((x * x + y * y)));
     }
     if(form == 1)
        return(n.real);
    }

    //returns the phase of the complex number
    double COMPLEX ::  getPhase(complex n, int form)
    {
     if(form == 0)
     {
        float x = n.real;
        float y = n.imaginary;
        return(atan2(y,x));
     }
     if(form == 1)
     {
        return(n.imaginary);
     }
    }

    //adds two complex numbers together
    COMPLEX::complex COMPLEX::add(COMPLEX::complex n, COMPLEX::complex m, int form)
    {
        complex temp, temp2, temp3;
     if(form == 0)
     { 
        temp.real = n.real + m.real;
        temp.imaginary = n.imaginary + m.imaginary;
        return(temp);
     }
     if(form == 1)
     {
        temp3.real = (n.real*cos(n.imaginary) + m.real*cos(m.imaginary));
        temp3.imaginary = (n.real*sin(n.imaginary) + m.real*sin(m.imaginary));
        temp2.real = getMagnitude(temp3, 0);
        temp2.imaginary = getPhase(temp3, 0);
        return(temp2);
     }
    }

    //subtracts one complex number from another
    COMPLEX::complex COMPLEX::subtract(COMPLEX::complex n, COMPLEX::complex m, int form)
    {
        complex temp, temp2;
     if(form == 0)
     {
        temp.real = n.real - m.real;
        temp.imaginary = n.imaginary - m.imaginary;
        return(temp);
     }
     if(form == 1)
     {
        temp.real = (n.real*cos(n.imaginary) - m.real*cos(m.imaginary));
        temp.imaginary = (n.real*sin(n.imaginary) - m.real*sin(m.imaginary));
        temp2.real = getMagnitude(temp, 0);
        temp2.imaginary = getPhase(temp, 0);
        return(temp2);
     }
    }

    //multiplies two complex together
    COMPLEX::complex COMPLEX::multiply(COMPLEX::complex n, COMPLEX::complex m, int form)
    {
        complex temp;
     if(form == 0)
     {
        float r1 = getMagnitude(n, 0);
        float r2 = getMagnitude(m, 0);
        float ang1 = getPhase(n, 0);
        float ang2 = getPhase(m, 0);
        float r3 = r1 * r2;
        if(r3 == 0)
        {
         temp.real = 0.0;
         temp.imaginary = 0.0;
         return(temp);
        }
        else
        {
         float ang3 = ang1 + ang2;
         temp.real = r3*cos(ang3);
         temp.imaginary = r3*sin(ang3);
         return(temp);
        }
     }
     if(form == 1)
     {
        if(n.real == 0 || m.real == 0)
        {
         temp.real = 0.0;
         temp.real = 0.0;
         return(temp);
        }
        else
        {
         temp.real = n.real * m.real;
         temp.imaginary = n.imaginary + m.imaginary;
         return(temp);
        }
     }
    }

    //divides one complex number by another
    COMPLEX::complex COMPLEX::divide(COMPLEX::complex n, COMPLEX::complex m, int form)
    {
        complex temp;
    if(form == 0)
    {
      if(getMagnitude(m, form) != 0)
     {

        float r1 = getMagnitude(n, 0);
        float r2 = getMagnitude(m, 0);  
        float ang1 = getPhase(n, 0);
        float ang2 = getPhase(m, 0);
        float r3 = r1 / r2;
        float ang3 = ang1 - ang2;
        temp.real = r3*cos(ang3);
        temp.imaginary = r3*sin(ang3);
        return(temp); 
     }
    }
    else
    {
        cout <<"Sorry, you can't divide by zero, instead, both parts will be shown as -1.337.\n";
        temp.real = -1.337;
        temp.imaginary = -1.337;
        return(temp);
    }
     if(form == 1)
     {
      if(m.real =! 0)
      {
        temp.real = n.real/m.real;
        temp.imaginary = n.imaginary - m.imaginary;
        return(temp);
      }
     }
     else
     {
        cout << "Sorry, but you can't divide by zero, instead, both parts will be shown as -1.337.\n";
        temp.real = -1.337;
        temp.imaginary = -1.337;
        return(temp);
     } 
    }

    //takes the nth power of a complex number
    COMPLEX::complex COMPLEX::getPower(int npower, COMPLEX::complex n, int form)
    {
        complex temp;
     if(form == 0)
     {
        float r1 = getMagnitude(n, 0);
        float ang1 = getPhase(n, 0);
        float r2 = pow(r1, npower);
        float ang2 = npower * ang1;
        temp.real = r2*cos(ang2);
        temp.imaginary = r2*sin(ang2);
        return(temp);
     }
     if(form == 1)
     {
        temp.real = pow(n.real, npower);
        temp.imaginary = npower * n.imaginary;
        return(temp); 
     }
    }

    //takes the mth root of a complex number
    COMPLEX :: complex COMPLEX::getRoot(int mroot, COMPLEX::complex n, int form)
    {
        complex temp;
     if(form == 0)
     {
        float r1 = getMagnitude(n,0);
        float ang1 = getPhase(n,0);
        float r2 = pow(r1, 1.0/mroot);
        float ang2 = ang1/mroot;
        temp.real = r2*cos(ang2);
        temp.imaginary = r2*sin(ang2);
        return(temp);
     }
     if(form == 1)
     {
        temp.real = pow(n.real, 1.0/mroot);
        temp.imaginary = n.imaginary/mroot;
        return(temp);
     }
    }

    //returns the conjugate of a complex number
    COMPLEX :: complex COMPLEX::getConjugate(COMPLEX::complex n)
    {
        float iman = n.imaginary * -1;
        complex temp = {n.real, iman };
        return(temp);
    }

    //changes a complex number to cartesian form
    COMPLEX :: complex COMPLEX::changeToCart(COMPLEX::complex n)
    {
        float rtemp = n.real;
        float ptemp = n.imaginary;
        float realtemp = rtemp * cos(ptemp);
        float imantemp = rtemp * sin(ptemp);
        complex temp = {realtemp, imantemp};
        return(temp);
    }

    //changes a complex number to polar form
     COMPLEX :: complex COMPLEX::changeToPolar(COMPLEX::complex n)
    {
        complex temp;
        temp.real =  getMagnitude(n, 0);
        temp.imaginary = getPhase(n, 0);
        return(temp);
    }
 error: cannot call member function ‘COMPLEX::complex COMPLEX::add(COMPLEX::complex, COMPLEX::complex, int)’ without object
namespace COMPLEX
{
    typedef struct{
        double real;
        double imaginary;
            }complex;

....
}