Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果只能通过';它存储在一个数组中?_C++_Arrays_Pointers - Fatal编程技术网

C++ 如果只能通过';它存储在一个数组中?

C++ 如果只能通过';它存储在一个数组中?,c++,arrays,pointers,C++,Arrays,Pointers,我正在制作一个可以求解多项式的程序(从.txt文件读入)。我已经让程序工作到读取文件并从多项式类的信息中生成一个对象,然后在数组中存储指向该多项式对象的共享指针。这样,如果我愿意,我可以访问for循环中的多项式对象。然而,我正试图修正一个函数,该函数将对多项式求值,求取x中替换的任何数字。例如,如果我的多项式是3x^2+11x+9,我想在x=7时解多项式,我只需将7作为eval函数的参数传入,它就会解出来。我的问题是,如果指向某个对象的指针位于数组中,我不知道如何调用该对象上的函数。。这是我的密

我正在制作一个可以求解多项式的程序(从.txt文件读入)。我已经让程序工作到读取文件并从多项式类的信息中生成一个对象,然后在数组中存储指向该多项式对象的共享指针。这样,如果我愿意,我可以访问for循环中的多项式对象。然而,我正试图修正一个函数,该函数将对多项式求值,求取x中替换的任何数字。例如,如果我的多项式是3x^2+11x+9,我想在x=7时解多项式,我只需将7作为eval函数的参数传入,它就会解出来。我的问题是,如果指向某个对象的指针位于数组中,我不知道如何调用该对象上的函数。。这是我的密码:

#include "polynomial.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>       // for exit() call

using namespace std;


void makePolynomials( shared_ptr<Polynomial> pointer1 [], int &x );


int main()
   {
   shared_ptr<Polynomial> poly[ 100 ];
   int nPolynomials = 0;

   makePolynomials( poly, nPolynomials );
   makePolynomials( poly, nPolynomials );

   // print out the polynomials
   // -------------------------
   for (int j=0; j < nPolynomials; j++)
      cout << *(poly[j]);

    if(*(poly[0]) == *(poly[1]))
    {
        cout << "true" << endl;
    }
    else
    {
        cout << "they are false" << endl;
    }

}


void makePolynomials( shared_ptr<Polynomial> poly[], int &nPolynomials )
   {
   // get the filename from the user and open the file
   // ------------------------------------------------
   char filename[20];
   cout << "Enter the filename: ";
   cin >> filename;

   ifstream infile;
   infile.open( filename );
   if (! infile.is_open()) {
      cerr << "ERROR: could not open file " << filename << endl;
      exit(1);
      }

   // read in the data and construct a polynomial for each input line
   // ---------------------------------------------------------------
   string polynom;
   while (getline( infile, polynom ))
      {
      poly[ nPolynomials ] = shared_ptr<Polynomial>(new Polynomial( polynom ));
      nPolynomials++;
      }
   }
但我收到一条错误消息,说shared_ptr没有成员评估。我不明白为什么会这样,因为eval是在多项式类的公共访问器下的头文件中原型化的?

表达式
*(poly[0])
在数组的第一个位置取消对共享ptr的引用:

Polynomial& p = *(poly[0]);
你的表达式
*(poly[0])->eval(7)将相当于

Polynomial& p = *(poly[0]);
p->eval(7);
shared_ptr<Polynomial>& p = poly[0];
p->eval(7);
它不能工作,因为
p
不是指针。你可以通过
poly[0]->eval(7)实现你想要的,相当于

Polynomial& p = *(poly[0]);
p->eval(7);
shared_ptr<Polynomial>& p = poly[0];
p->eval(7);
shared_ptr&p=poly[0];
p->eval(7);

shared\u ptr
实现
操作符->
的方式是返回指向托管实例的指针,因此您可以使用此操作符调用
eval
方法。另请参阅文档。

为了完成上面的答案,您应该使用静态强制转换,这样至少编译器会告诉您为什么您所做的不起作用

很可能,声明:

*(poly[i])->eval(7)
被解释为:

  • 获取多边形数组中的第i项
  • 尝试对(预期的)指针调用eval方法,但这不起作用,因为poly数组的第i项是对共享_ptr对象的引用,而不是多项式
  • 取消引用方法的结果(返回)
  • 在代码中,您可以使用:

    static_cast<Polynomial&>(*poly[0]).eval(7)
    
    static_cast(*poly[0])eval(7)
    

    这告诉编译器您要调用共享的\u ptr类的多项式&转换运算符,然后,使用生成的引用多项式实例调用eval方法。

    Try poly[0]->eval(7)@克丽丝提坦黄昏哇,真管用。非常感谢。你能解释一下为什么我必须像这样指向for循环中的数组吗……for(int j=0;j运算符->
    取消对指针的引用。