访问在构造函数期间创建的值 - C++
Accessing values created during a constructor - C++
我今天有一个关于访问变量的问题,这些变量的值是在重载构造函数期间创建的。i拥有的函数返回一个变量,以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() {}
您的代码定义了一个类FCalc
。它还定义了这个类的两个对象,FCalculate
(全局(和FCalc
(main
中的本地(,令人困惑地命名为与类相同的对象。
如果要访问函数中的变量,则该变量必须是全局变量或作为函数参数传入。(这没什么特别的。
您的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;
}
默认构造函数声明一些局部变量,但不对它们执行任何操作。它也没有设置NewUserNum1
、NewUserNum2
或NewUserOperation
((奇怪地命名的(成员变量(。
你应该将 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();
}
在类中,您可以拥有属于实例的方法 或者,您可以拥有独立于 实例,即没有"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(foo);
通过声明函数,例如
void sayUserOperation(FCalc& f)
{
...
auto ch = f.GetUserOperation();
}
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息