【问题标题】:Passing overloaded constructor to function between classes将重载的构造函数传递给类之间的函数
【发布时间】:2019-01-27 11:08:04
【问题描述】:

我必须将类Parameters 的重载构造函数放入类Solver 的函数中。 这是参数标题:

#ifndef Parameters
#define Parameters

#include <iostream>
#include<conio.h>
#include<fstream>
#include<string>
using namespace std;

class Parameters
{
    int M;
    double dx;
    double eps;
public:
    Parameters( );
    Parameters(int M1, double dx1, double    eps1 );
    Parameters( string  fileName);
};
#endif

构造函数初始化Mdxeps 使用默认值或由用户从键盘或文件中选择。

我想要另一个包含这个初始化值的类(为了解决最近的一些方程,也在这个类中)。

问题是,虽然我尝试通过值、引用或/指针来做到这一点,但总是有一些错误或代码编译但什么也没做。

这是我的 Solver 类:

#include "ParametersH.h"
#include "EquationH.h"
#include <iostream>
#include<conio.h>
#include<fstream>
#include<string>
#include<vector>

using namespace std;
class Solver
{
public:
    int Solve( Parameters& obj );
};

int Solver::Solve( Parameters& obj)
{
    cout << obj.M; // M is private so it fails :<
    // another attempt was like this:
    Parameters *pointer = new Parameters();
}

int main()
{
    Solver Solve();
    return( 0 );
}

我真的无法处理这个,希望有人能帮忙。

【问题讨论】:

  • Solver Solve(); 这声明了一个名为 Solve() 的函数,它没有返回一个 Solver 对象的参数。您可能希望将其更改为 Solver solver; solver.Solve(existingParameterObject);
  • @lubgr 但是参数类对象只是一个重载的构造函数......你能更广泛地解释一下我应该放什么吗?
  • Solver::Solve(Parameters&amp; obj) 的参数不是构造函数,而是Parameters 类型的对象。因此,您必须先构建它。
  • @lubgr 这里:Solver::Solve(Parameters& obj) 参数代表类的名称,对吗?类Parameters的对象类型是指M,dx,eps的类型,因为构造函数Parameters填充它们?所以我必须在 M、dx、eps 等类型的 Solver 类中构造对象?
  • @JeJo 我试图通过朋友班做到这一点,但失败了。错误是“在非类类型'int'的'obj'中请求成员M(来自类参数的私有变量)。

标签: c++ function class c++11 constructor


【解决方案1】:

正如@lubgr 在 cmets 中提到的,这里

Solver Solve();

你声明了一个名为 Solve() 的函数,没有参数,它给你一个 Solver 对象,而不是成员函数 Solve( Parameters&amp; obj );

如果您的目标是访问 Solver 类中 Parameters 类的私有成员:您可以

  • Solver定义为Parameters的朋友:See here
  • 通过setters and getters访问或
  • 创建一个Parameters 的结构,您可以通过它访问里面的所有内容 它

但是,您似乎只需要一个结构体Parameters 和一个简单的函数Solve( Parameters&amp; obj);,就可以完成您的工作。

struct Parameters
{
    int m_;
    double dx_, eps_;
    Parameters(int M1, double dx1, double   eps)
        : m_(M1), dx_(dx1), eps_(eps) // provide other contrs as per
        {}
};

int Solve(Parameters& obj)
{
    std::cout << obj.m_ << " " << obj.dx_ << " " << obj.eps_ << std::endl;
    return obj.m_;
}

现在在main() 中:

std::cout << "result: " << Solve(Parameters(1, 2.0, 3.0));

【讨论】:

  • 错误是:“请求成员 'm_, eps_dx_' 这是非类类型 'int'”和“求解未在此范围内声明”(为什么因为它的声明在类)
  • @Uroboros 如果您遵循我提到的第一个选项:为了访问Parameters 类的成员(即m_, eps_ dx_),您需要将对象Parameters 传递给函数每时每刻。如示例中的Solve( Parameters&amp; obj );ideone.com/hCbJYa 代码
  • (感谢您的耐心等待)我尝试了 struct 和朋友,同样的错误。纠正我的错误:变量 m_、eps_、dx_ 用于“存储”类参数的变量:M、eps、dx?
  • @Uroboros 现在我明白了。您在Solver 的私有部分中有Parameters,只有Solver 可以访问,外部世界不能访问。这就是问题所在:) 请注意,要创建Parameters 类的对象,您需要在Solver 类之外使用它。像这样:ideone.com/Axa5gO你的思维方式不好 改变一下链接试试吧。
  • *"Solve was not declared in this scope" * from thins error 我认为,您需要在ParametersH.h 中包含Solver.h,以便链接器可以在其中查找Solver。请记住,我们在ParametersH.h 中有这行friend class Solver ;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多