访问在构造函数期间创建的值-C ++

时间:2018-07-04 04:37:23

标签: c++ function constructor

我今天有一个问题,关于访问变量的值是在重载的构造函数期间创建的。我已返回的函数以i(int)或ch(char)为开头的变量。

我正在尝试使用类似std :: cout << FCalc.GetUserNum1();的行。在另一个功能中以打印正确的值。现在,我已经可以从主菜单上执行此操作,但是无法从其他功能上执行此操作。

void vCalcNum();
char chGetUserOperation();
int iGetUserNum1();
int iGetUserNum2();
void vTestFunction();

FCalc FCalculate;
int main() 
{
    vCalcNum();
    //Overloaded constructor (Int, Int, Char) Each function returns variable
    FCalc FCalc(iGetUserNum2(), iGetUserNum1(), chGetUserOperation());
    std::cout << FCalc.GetUserNum1(); //cout prints proper value to console 


    sayUserOperation();
    return 0;

} 


void sayUserOperation()
{
    std::cout << FCalc.GetUserOperation(); 
    //This is where I am having trouble reffrencing GetUserOperation.
    // Class and getters are located in another file - can update if code is 
    //needed I have tried variants such as FCalculate.GetUserOperation() 
    //which returns nothing
}




//Edit to add FCalc.h source code

class FCalc
{
public:
    FCalc(); //constructor

    FCalc(int, int, char); //overlaoded constructor

    ~FCalc(); //destructor

    char GetUserOperation() const;
    int GetUserNum1() const;
    int GetUserNum2() const;


private:

    int NewUserNum1;
    int NewUserNum2;
    char NewUserOperation;




};

//edited to add FCalc.cpp source code
    #pragma once
#include "FCalc.h"
#include <iostream> 
#include <iomanip>
#include <string>


char FCalc::GetUserOperation() const {return NewUserOperation;}
int FCalc::GetUserNum1() const { return NewUserNum1;}
int FCalc::GetUserNum2() const { return NewUserNum2;}

FCalc::FCalc()
{
    int UserNum1 = 0;
    int UserNum2 = 0;
    char UserOperation;
}

FCalc::FCalc(int UserNum2, int UserNum1, char UserOperation)
{
    NewUserNum1 = UserNum1;
    NewUserNum2 = UserNum2;
    NewUserOperation = UserOperation;
}
FCalc::~FCalc() {}

3 个答案:

答案 0 :(得分:0)

您的代码定义了一个类df.insert(2, ('info','count'), s) print (df) info '2002' '2003' '2004' 'PID' 'Age' count 't1' 't2' 't1' 't2' 't1' 't2' 0 101 30 2 NaN 2 2 1.0 NaN NaN 1 102 28 3 2.0 5 1 NaN 10.0 100.0 。它还定义了此类的两个对象FCalc(全局)和FCalculate(在FCalc中为本地),这两个类的名称容易混淆。

如果要访问函数中的变量,则该变量必须是全局变量或作为函数参数传入。 (这对对象没什么特别的。)

您的main不会将其本地main变量传递给FCalc,因此sayUserOperation无法访问它。 (相反,它看到的是名为sayUserOperation class ,但这对您没有帮助。)

这里是一种方法:

FCalc

void sayUserOperation(const FCalc &x) { std::cout << x.GetUserOperation() << '\n'; } int main() { vCalcNum(); FCalc calc(iGetUserNum2(), iGetUserNum1(), chGetUserOperation()); std::cout << calc.GetUserNum1() << '\n'; sayUserOperation(calc); } 无用的原因是,即使FCalculate.GetUserOperation()变量是可访问的,其内容也未初始化。特别是:

FCalculate

您的默认构造函数声明了一些局部变量,但对它们不执行任何操作。它还没有设置FCalc::FCalc() { int UserNum1 = 0; int UserNum2 = 0; char UserOperation; } NewUserNum1NewUserNum2(((名字))成员变量)。

答案 1 :(得分:0)

您应该将FCalc对象作为参数传递给void sayUserOperation()函数。 我认为您已经创建了一个FCalc FCalculate要使用的全局对象。

void sayUserOperation()
{
     std::cout << FCalculate.GetUserOperation(); 
}

否则,将功能签名修改为:

void sayUserOperation(const FCalc &obj) //Send object as reference and use it
{
    std::cout << obj.GetUserOperation(); 
}

答案 2 :(得分:0)

在一个类中,您可以具有属于实例的方法 或者您可以拥有独立于 实例,即没有“ this”指针。

当您编写FCalc.GetUserOperation()时,您并不一致, 要么写

FCalc foo(...)
auto ch = foo.GetUserOperation(); // calling the method on the instance foo

或声明GetUserOperation静态

static char GetUserOperation();
...
auto ch = FCalc::GetUserOperation();

您的默认构造函数FCalc不正确,您声明了局部变量并 然后在此处初始化它们,一旦离开构造函数,它们便不再存在。

相反,您可以编写类似(在C ++ 11之前)的内容

FCalc::FCalc()
: NewUserNum1(0)
, NewUserNum2(0)
, NewUserOperation(0);
{}

以类似的方式,您可以将其他构造函数编写为

FCalc::FCalc(int UserNum2, int UserNum1, char UserOperation)
: NewUserNum1(UserNum1)
, NewUserNum2(UserNum2)
, NewUserOperation(UserOperation);
{}

通常,成员变量使用前缀m__声明。 为了更容易看到它是一个实例变量 并用大写字母表示类型,但这只是我的 偏爱。

避免同时声明类的全局实例,这将是 在主体中足以声明实例

FCalc foo(iGetUserNum2(), iGetUserNum1(), chGetUserOperation());

然后将其传递给sayUserOperation

sayUserOperation(foo);

通过声明

之类的函数
void sayUserOperation(FCalc& f)
{
 ...
 auto ch = f.GetUserOperation();
}