【问题标题】:Accessing values created during a constructor - C++访问在构造函数期间创建的值 - C++
【发布时间】:2018-07-04 04:37:23
【问题描述】:

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

我正在尝试使用像 std::cout

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() {}

【问题讨论】:

  • 请提供FCalc类的代码。
  • main 声明了一个名为 FCalc 的变量。 sayUserOperation 没有。因此,它当然无法调用从未声明过的名称上的方法。
  • @BlakeLanders,请将其编辑到问题中。这是问题的重要组成部分。
  • 已编辑帖子以包括 FCalc.h 和 FCalc.cpp 源代码更远 - 对缺乏高质量的格式表示歉意。我是新来的:)
  • 我觉得你很困惑,还没有掌握c++的一些基本概念。无论如何,一开始都不容易。我可以看到您正在尝试调用FCalc.GetUserOperation(),但FCalc(变量不是类)仅作用于 main,因此在 main 之外您无法访问该变量。为了解决这个通过Fcalc(请调用变量类似fcalc)到sayUserOperation作为参数,然后你可以访问实例。

标签: c++ function constructor


【解决方案1】:

您的代码定义了一个类FCalc。它还定义了这个类的两个对象,FCalculate(全局)和FCalcmain 中的局部),容易混淆的名称与该类相同。

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

您的main 没有将其本地FCalc 变量传递给sayUserOperation,因此sayUserOperation 无法访问它。 (它看到的是名为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;
}

您的默认构造函数声明了一些局部变量,但不对它们做任何事情。它也没有设置NewUserNum1NewUserNum2NewUserOperation((奇怪的命名)成员变量)。

【讨论】:

  • 对变量/函数/类的名称表示歉意。我最终对代码进行了大约一千次的修改和重写,这些都是我在后来的版本中得到的糟糕的代码:) 我能够实现你的代码并让它正确地回读。感谢您的帮助!现在要真正了解这些变化在做什么:)
【解决方案2】:

您应该将 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(); 
}

【讨论】:

    【解决方案3】:

    在一个类中,你可以拥有属于一个实例的方法 或者您可以拥有独立于 实例,即没有“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__ 声明 为了更容易看出它是一个实例变量 并且有类型的大写字母,但这只是我的 偏爱。

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

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

    然后将其传递给 sayUserOperation

    sayUserOperation(foo);
    

    通过像

    这样声明函数
    void sayUserOperation(FCalc& f)
    {
     ...
     auto ch = f.GetUserOperation();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2013-04-29
      • 2012-11-03
      • 1970-01-01
      相关资源
      最近更新 更多